如何在 QWidget 中插入 QML 视图

Posted

技术标签:

【中文标题】如何在 QWidget 中插入 QML 视图【英文标题】:How to insert QML view in a QWidget 【发布时间】:2017-04-05 14:30:52 【问题描述】:

我是 QML 的初学者并尝试在 QWdiget 中插入 QML 视图,但我不明白为什么它不起作用。

这是我的 qml 文件的一个简单示例(这不是真正的文件):

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.2
import QtQml.Models 2.1

ObjectModel 
  id: itemModel
  Rectangle 
    color: "orange"
    anchors.fill: parent
  
  Rectangle 
    color: "orange"
    anchors.fill: parent
  
  Rectangle 
    color: "orange"
    anchors.fill: parent
  
  
  ListView 
    id: my_list
    anchors.fill: parent
    model: itemModel
  


这就是我在主窗口中加载它的方式:

QQuickView *view = new QQuickView();
QWidget *container = QWidget::createWindowContainer(view, this);
container->setMinimumSize(200, 200);
container->setFocusPolicy(Qt::TabFocus);
view->setSource(QUrl("main.qml"));
ui->dockWidget->setWidget(container);

如何在 QWidget 中插入我的视图? 此时,我确实需要使用 QML 视图,并且因为我需要在已经存在的应用程序中使用它,所以我不能只使用 QML 项目。

非常感谢您的帮助,祝您有美好的一天!

【问题讨论】:

【参考方案1】:

存在一个特殊的QQuickWidget,专门用于该特定目的。

QQuickWidget *view = new QQuickWidget;
view->setSource(QUrl::fromLocalFile("myqmlfile.qml"));
view->show();

【讨论】:

您好!感谢您的回答。但是,即使我尝试使用 QQuickWidget,我也有以下错误:Syntax error : ListView 而且我不明白这里出了什么问题。 您的代码没有根项目。另外,由于 QQuickWidget 是 QQuickWindow 的包装器,我假设根项必须是一个窗口,要么是 ApplicationWindow,要么只是一个 Window 这很奇怪,因为我已经尝试过了。但是,如果我将窗口用作根项,则会出现以下错误消息:QQuickWidget only supports loading of root objects that derive from QQuickItem. If your example is using QML 2, (such as qmlscene) and the .qml file you loaded has 'import QtQuick 1.0' or 'import Qt 4.7', this error will occur. To load files with 'import QtQuick 1.0' or 'import Qt 4.7', use the QDeclarativeView class in the Qt Quick 1 module. 但我没有使用 QtQuick 1.0 或 Qt 4.7。如果我使用DeclarativeView,它将不支持import QtQuick 2.4 如果你的根是说......一个矩形,它会起作用吗?实际上它可能已经是一个Window,所以它不需要或不支持根作为窗口。看起来是“QQmlApplicationEngine”,它要求根是一个窗口,不像qtquick视图,它不支持窗口根。【参考方案2】:
    QQmlApplicationEngine *m_engine in MainWindow.h 在 MainWindows.cpp 中设置:
m_engine->addImportPath("qrc:/qml/imports");
m_engine->load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
 // m_engine->rootContext()->setContextProperty("mainWindows", this);
qDebug() << "Ok engine created";`
`QWindow *qmlWindow = qobject_cast<QWindow*>(m_engine->rootObjects().at(0));
QWidget *container = QWidget::createWindowContainer(qmlWindow, this);
container->setMinimumSize(200, 200);
container->setMaximumSize(1200, 900);
ui->verticalLayout->addWidget(container);`

【讨论】:

以上是关于如何在 QWidget 中插入 QML 视图的主要内容,如果未能解决你的问题,请参考以下文章

Qt5。在 QML 中嵌入 QWidget 对象

通过 QWidget 类在 QML 中的事件处理程序

QWidget 中的 QML 小部件

如何在 Blackberry Cascades、QML 和 C++、QT 的列表视图中获取 Web 视图

如何在 QML 中链接两个滚动视图?

如何在黑莓 10 级联 qml 中获取列表视图行数?