2014-12-06 22 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