Qt5 Использование QWidget с QtQuick2

Есть несколько проблем с комбинацией Qt5 и QtQuick2. Всякий раз, когда вы хотите использовать некоторые классы на основе QWidget, вы сначала сталкиваетесь со следующей проблемой:

Вы должны использовать QApplication вместо Qt5 QGuiApplication, Ну, это можно легко изменить, верно?

Так что теперь я использую QApplication но всякий раз, когда я пытаюсь использовать класс, основанный на QWidget, моя программа либо вылетает, либо выдает какие-то бессмысленные сообщения об ошибках.

Как тогда использовать старые QWidgets с Qt5? Я знаю, что они не лучшее решение с Qt5, но они весьма полезны …

Постскриптум Я занимаюсь разработкой своего приложения в Linux для всех платформ.
Я также использую автоматически сгенерированный класс QtQuick2ApplicationViewer для рендеринга приложений на основе QtQuick 2.0.

4

Решение

В Qt 5.1 (и предположительно с этого момента) вы должны использовать QWidget :: createWindowContainer.
Ваше приложение должно быть приложением на основе QWidget и размещать QML внутри QWidget. Помещение QWidgets в приложение QML не поддерживается. запись в блоге.

Если у вас есть класс формы, и вы хотите поместить qml в виджет контейнера.

Если у вас есть этот QML:

import QtQuick 2.0

Rectangle {
property alias text: textItem.text
width: 156
height: 35
Text {
width: 150
height: 20
text: qsTr("Hello World")
id: textItem
}
}

В файле с именем myqml.qml укажите путь к нему с префиксом qml файла ресурсов.

Затем поместите в форму конструктор:

ui->setupUi(this); // as normal
QQuickView* view = new QQuickView();
QWidget* widget = QWidget::createWindowContainer(view, ui->container);
view->setSource(QUrl("qrc:/qml/myqml.qml"));
if(view->status()!=QQuickView::Ready)
qDebug("can't initialise view");
widget->setMinimumSize(500,100);
QQuickItem* container = view->rootObject();

Затем, когда вы хотите взаимодействовать с QML:

container->setProperty("text", "Hello alternate universe");
4

Другие решения

Кажется, это известная ошибка:
https://bugreports.qt.io/browse/QTBUG-25643

Это также, кажется, имеет ссылки на возможные решения / обходные пути, но я не проверял их.

О QWidgets и «они не лучшее решение»: во-первых, до будущего Qt 5.1 (или какой бы то ни было версии) с полными компонентами Qt Quick для настольных компьютеров они являются единственным разумным вариантом для обычных настольных приложений и только вариант по определению лучший вариант;)

Но даже в будущем QWidgets — это 100% правильный выбор для приложения Qt5. Единственное, что у них есть, это то, что они вряд ли будут сильно развиваться, поэтому то, что у вас есть сейчас, — лучшее, что вы когда-либо будете иметь с ними. Если это хорошо, то это решение, которое нужно выбрать.

3

По вопросам рекламы [email protected]