如何从 QtQuickWidget 加载 qt quickui 表单?

How to load qt quick ui form from QtQuickWidget?

我有一个qt quick ui form,里面有两个文件:LogPanel.qmlLogPanelForm.ui.qml

LogPanelForm.ui.qml 文件:

import QtQuick 2.4
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.3

Item {
    id: item1
    width: 800
    height: 600
    property alias btnAdd: btnAdd

    Button {
        id: btnAdd
        text: "add"
    }
}

LogPanel.qml 文件:

import QtQuick 2.4
import QtQuick.Dialogs 1.2
import QtQuick.Window 2.3

LogPanelForm {
    btnAdd.onClicked: {
        console.log("1")
    }
} 

我想从 C++ 代码加载此 quick ui form

如果我设置来源 LogPanel.qml :

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

表单控件不会显示。并且有错误信息:

file::/qml/LogPanel.qml:5:1: LogPanelForm is not a type 
    LogPanelForm {
    ^ 

如果我设置来源 LogPanelForm.ui.qml :

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

不会调用LogPanel.qml中的onClick事件

我应该如何从 C++ 代码加载表单,以便控件和事件处理都能正常工作?

您必须在您的 qml 文件中加载您的 .ui.qml 文件:

QmlOne.qml:

       Window {
           QMLTwo{ //This your ui.qml file
           anchors.fill: parent
      }

你好,

您正在使用 QUrl::fromLocalFile 而不是 QUrl 的隐式版本。问题实际上是 url。正如您已经研究过的那样,它应该以 qrc:/ 开头。

此外,还有一个有用的 API 用于管理资源:QDir::setSearchPaths(或 QDir::addSearchPath)。它可能有助于管理您的路径。例如,您可以在调试时从真实文件夹加载资源,在发布时从资源加载资源,但在代码中保留所有字符串引用而不更改(如 myQml:/something)。