在C ++中扩展QML ApplicationWindow

时间:2014-12-06 21:08:32

标签: c++ qt qml qt-quick

如何正确扩展QML ApplicationWindow类型?根据文档,ApplicationWindow实例化了一个QQuickWindow。所以我尝试从QQuickWindow进行子类化,并将类型暴露给QML作为MyWindow。问题是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" }
        }
    }
}

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

1 个答案:

答案 0 :(得分: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找到。