4

Qt5 和 QtQuick2 的组合存在一些问题。每当您想使用许多基于 QWidget 的类时,您首先会遇到以下问题:

您应该使用QApplication而不是 Qt5 的QGuiApplication. 那么这很容易改变,对吧?

所以现在我正在使用QApplication,但每当我尝试使用基于 QWidget 的类时,我的程序要么崩溃,要么导致一些无意义的错误消息。

那我应该如何将旧的 QWidgets 与 Qt5 一起使用?我知道它们不是 Qt5 的最佳解决方案,但它们非常有用......

PS我正在Linux中为所有平台开发我的应用程序。
我还使用自动生成的 QtQuick2ApplicationViewer 类来渲染基于 QtQuick 2.0 的应用程序。

4

2 回答 2

4

在 Qt 5.1 中(大概从现在开始)你应该使用 QWidget::createWindowContainer。您的应用程序应该是基于 QWidget 的应用程序,并将 QML 放在 QWidgets 中。不支持将 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");
于 2013-11-09T12:11:26.880 回答
3

看来这是一个已知的错误: https ://bugreports.qt.io/browse/QTBUG-25​​643

这似乎也有可能的解决方案/解决方法的链接,但我没有检查它们。

关于 QWidgets 和“它们不是最好的解决方案”:首先,在具有完整桌面 Qt Quick 组件的未来 Qt 5.1(或任何版本)之前,它们是常规桌面应用程序的唯一明智选择,并且只有根据定义,选项是最佳选项;)

但即使在未来,QWidgets 也是 Qt5 应用程序 100% 有效的选择。他们唯一的问题是,他们不太可能发展太多,所以你现在拥有的,是你将拥有的最好的。如果没问题,那么他们就是选择的解决方案。

于 2012-12-22T20:36:55.527 回答