Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Взаимодействие С++ и qml
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Quick
MishaUA
Ситуация следующая:
Есть 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
Воспользуйтесь сигналами и слотами.
MishaUA
Это логично))
но как подключить слоты нужного объекта к нужному окну QML, если их будет несколько?
Trisch
Ну можно зарегистрировать объект который будет посылать сигналы
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, свой объект который будет отсылать сигналы. И, чисто теоретически сигналы и одного виджета, не должны пересекаться с другим
MishaUA
Сделал немножко по ином:

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
Что-то мне кажется что без "бубна" это не сделать.

Почему бы, просто, не поставить под "кругом" какой нибудь фон?
MishaUA
потому что фон под самим виджетом не однородный (на скрине видно)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.