c++ - 如何从 QtQuickWidget 加载 qt Quick ui 表单?

标签 c++ qt qt-quick

我有一个qt快速ui表单,其中包含两个文件: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++ 代码加载这个快速 ui 表单:

如果我设置源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++ 代码加载表单,以便控件和事件处理都可以工作?

最佳答案

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

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

关于c++ - 如何从 QtQuickWidget 加载 qt Quick ui 表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48439121/

相关文章:

android - Cocos2dx替换场景报错

c++ - 节点队列(链表)C++

c++ - 在 Qt 中缩放图形

qt - 错误的坐标白色获取项目相对于其父项的真实位置

c++ - 当在错误槽中启动事件循环时发生 ContentNotFoundError 时,QNetworkReply 会发出两次错误信号

c++ - 重载索引运算符

c++ - Linux : Qt Creator debugger hangs while QQmlApplicationEngine is created

c++ - QT部署错误

c++ - 如何在执行 qmlRegisterType 后获得有效的类实例?

qt - QML 交互式控制台小部件