crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Взаимодействие С++ и qml
MishaUA
  опции профиля:
сообщение 30.1.2014, 2:22
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Ситуация следующая:
Есть QMainWindow, при нажатии на главной форме кнопки "Добавить" будет создаваться на этой форме новый клас, наследуемый от Qwidget, который будет содержать QML окно (таким образом http://www.ics.com/blog/combining-qt-widge...er#.UumIKLQf6Ul ). Этот новый класс и qml скрипт, размещенный в нем, должны взаимодействовать. Планировалось в этот клас добавить еще один клас наследуемый от QDeclarativeItem и с помощью Q_PROPERTY взаимодействовать со скриптом, но проблема в том, что класов, наследуемых от Qwidget, будет создаваться несколько и скрипт должен взаимодействовать только с тем (QDeclarativeItem), в котором он был создан.

Написал немного запутано, на деле, должно выглядеть примерно так:
Нажимаем на форме кнопку "Добавить", создается новый объект класса, наследуемый от Qwidget (назовем "ТИП_1"), в нем окно QML. В классе тикает таймер, инкрементируя переменную, значение этой переменной должно передаваться в QML окно, и там как то отображаться.
В случае, если будет несколько классов "ТИП_1", каждый должен обмениваться данными только со "своим" QML окном.

Вобщем, как то так. Может кто то скажет, что проще было бы использовать только QML, без С++, но программа уже создана, и применяется примерно на 100 компах, сейчас просто необходимо добавить "красивое" отображение некоторых элементов, которое проблематично сделать на с++.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 30.1.2014, 15:45
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Воспользуйтесь сигналами и слотами.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 30.1.2014, 17:03
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Это логично))
но как подключить слоты нужного объекта к нужному окну QML, если их будет несколько?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 30.1.2014, 18:11
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Ну можно зарегистрировать объект который будет посылать сигналы
qmlRegisterType<ObjectQML>("Object", 1, 0, "Object");


ObjectQML - это наш объект, который посылает сигналы. Потом из этого объекта послать сигнал, отловить и присвоить объекту который уже создан в нашем конкретном виджите. Как то так:
pView = new QQuickView;
pQML = new ObjectQML;
pView->setSource(QUrl("main.qml"));
QObject *pObject = pView->rootObject();
pQML = pObject->findChild<ObjectQML *>();


Каждый виджет создает свой объект QML, свой объект который будет отсылать сигналы. И, чисто теоретически сигналы и одного виджета, не должны пересекаться с другим

Сообщение отредактировал Trisch - 30.1.2014, 18:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 1.2.2014, 14:28
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Сделал немножко по ином:

QtQuick2ApplicationViewer    *view = new QtQuick2ApplicationViewer();
view->rootContext()->setContextProperty("MyClass", this);

Qwidget    *container = QWidget::createWindowContainer(view);

container->setMinimumSize(200, 200);
container->setMaximumSize(200, 200);
container->setFocusPolicy(Qt::TabFocus);

view->setSource(QUrl("source.qml"));

// в компоновщик
lay->addWidget(container);


Работает, но хотелось бы чтобы фон был прозрачным. К примеру, если в QML написть:
import QtQuick 2.1
Rectangle {
    id: rectangle
    color: "green"
    width: 200
    height: 200
    radius: 90
}

То в вместо прозрачного фона получается черный фон (см фото).
Пробовал делать так:
QtQuick2ApplicationViewer    *view = new QtQuick2ApplicationViewer();

QSurfaceFormat format;
format.setAlphaBufferSize(8);
view->setFormat(format);
view->setClearBeforeRendering(true);
view->setColor(QColor(Qt::transparent));
view->setFlags(Qt::FramelessWindowHint);

view->rootContext()->setContextProperty("MyClass", this);

Qwidget    *container = QWidget::createWindowContainer(view);
container->setAttribute(Qt::WA_TranslucentBackground);
container->setStyleSheet("background:transparent");

container->setMinimumSize(200, 200);
container->setMaximumSize(200, 200);
container->setFocusPolicy(Qt::TabFocus);

view->setSource(QUrl("source.qml"));

// в компоновщик
lay->addWidget(container);

но не помогло(((((
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 5.2.2014, 0:02
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Что-то мне кажется что без "бубна" это не сделать.

Почему бы, просто, не поставить под "кругом" какой нибудь фон?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 5.2.2014, 0:06
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


потому что фон под самим виджетом не однородный (на скрине видно)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.4.2024, 13:32