如何正确扩展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。
答案 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找到。