如何从QtQuickWidget加载qt quick ui表单?

时间:2018-01-25 09:04:05

标签: c++ qt qt-quick

我有一个qt quick ui form,其中包含两个文件:LogPanel.qml LogPanelForm.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 ++代码加载表单,控件和事件处理都可以工作?

2 个答案:

答案 0 :(得分:1)

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

QmlOne.qml:

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

问候,

答案 1 :(得分:1)

您正在使用QUrl::fromLocalFile而不是QUrl的隐式版本。问题在于实际网址。它应该以您已经研究过的qrc:/开头。

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