2014-12-06 78 views
1

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

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

这似乎是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中找到。

+0

是的,我用qmlRegisterType来注册自定义的QQuickWindow类型。问题是我如何添加QtQuick.Controls.ApplicationWindow提供的功能。 – 2014-12-06 21:47:54

+0

首先,只要属性解决了运行时间,它应该继承QtQuick.Controls.ApplicationWindow中暴露给QML的所有功能。其次,你可以添加新的功能,并通过q_properties等公开它。 – AlexanderVX 2014-12-06 22:29:38

+1

好吧,但问题是没有任何ApplicationWindow类在C++中继承。 ApplicationWindow是QML类型,从Window(QML)派生,用于实例化QQuickWindow(C++)。在我的例子中,MyQuickWindow(C++)继承自QQuickWindow(C++),但现在我们没有任何与ApplicationWindow(QML)关联的东西。在你链接的Qt例子“Extending QML - Inheritance and Coercion”中,被扩展的Person类型是一个用户创建的类型。我试图扩展ApplicationWindow,它没有我知道的C++主干。 – 2014-12-06 22:58:58