首页 文章

在C中扩展QML ApplicationWindow

提问于
浏览
4

如何正确扩展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 回答

  • 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找到 .

相关问题