【问题标题】:Extending QML ApplicationWindow in C++在 C++ 中扩展 QML ApplicationWindow
【发布时间】:2014-12-06 21:08:32
【问题描述】:

如何正确扩展 QML ApplicationWindow 类型?根据文档,ApplicationWindow 实例化了一个 QQuickWindow。所以我尝试从 QQuickWindow 进行子类化并将类型作为 MyWindow 暴露给 QML。问题是 MyWindow 实际上并没有扩展 QML 类型的 ApplicationWindow,所以你没有得到所有的属性,比如 menuBar 和 toolBar。如何在 C++ 中扩展 ApplicationWindow 并将其公开给 QML?这是我目前正在做的事情:

class MyQuickWindow : public QQuickWindow
{
    //...irrelevant additions
}


int main()
{
    QGuiApplication app(argc, argv);
    qmlRegisterType<MyQuickWindow>("MyExtensions", 1, 0, "MyApplicationWindow");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    return app.exec();
}

这是 QML 文件:

import QtQuick 2.0
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.1
import MyExtensions 1.0

MyApplicationWindow {
    width: 800
    height: 600
    visible: true

    menuBar: MenuBar {    // ERROR: menuBar is not a property
        Menu {
            title: "File"
            MenuItem { text: "New" }
            MenuItem { text: "Open" }
        }
    }
}

请注意,出于其他原因,我需要在 QQuickWindow 中添加自己的 C++ 内容。

【问题讨论】:

    标签: c++ qt qml qt-quick


    【解决方案1】:

    这似乎是qmlRegisterType 的工作。如果您错过了 C++ 部分的某些内容,很难说,但注册类型应该会有所帮助。那是为了暴露类型本身,并且应该启用派生的 QQuickWindow 功能(实际上是从 ApplicationWindow 派生的)。但是对于您要添加的内容,您需要处理 Q_PROPERTY 和 Q_INVOKABLE (用于函数)机制。查看整个 Q_* QObject 宏。

    如果这还不够,那么还有一个inheritance 的例子。

    更正:作者正在处理 QML 制作的类型,但他仍然可以尝试自己模仿该类型。 ApplicationWindow.qml 源代码的路径是:C:\Qt\5.3\Src\qtquickcontrols\src\controls 其中 C:\Qt\5.3\ 是所选 Qt 版本的根目录。我会尝试这样做,除非我们想了解显式 QML 继承。该文件也可以在 Qt 源代码repository 中找到。

    【讨论】:

    • 是的,我已经使用 qmlRegisterType 来注册自定义 QQuickWindow 类型。问题是如何添加 QtQuick.Controls.ApplicationWindow 提供的功能。
    • 首先,只要属性在运行时解析,它就应该从暴露给 QML 的 QtQuick.Controls.ApplicationWindow 继承所有功能。其次,您可以添加新功能并通过 q_properties 左右公开它。
    • 好的,但问题是在 C++ 中没有任何可以继承的 ApplicationWindow 类。 ApplicationWindow 是 QML 类型,派生自 Window (QML),它实例化了 QQuickWindow (C++)。在我的示例中,MyQuickWindow (C++) 继承自 QQuickWindow (C++),但现在我们没有与 ApplicationWindow (QML) 关联的任何内容。在您链接的 Qt 示例“扩展 QML - 继承和强制”中,正在扩展的 Person 类型是用户创建的类型。我正在尝试扩展 ApplicationWindow,它没有我知道的 C++ 主干。
    • 对了,我在Qt的源码中发现了:C:\Qt\5.3\Src\qtquickcontrols\src\controls\ApplicationWindow.qml 你可以复制一下,根据自己的需要调整(?)
    • 如果有,可以使用MaintenanceTool下载Qt源代码。
    猜你喜欢
    • 1970-01-01
    • 2021-03-10
    • 2019-02-14
    • 2019-08-04
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    相关资源
    最近更新 更多