2017-04-03 45 views
4

我正在處理Qt應用程序,我需要動態創建窗口。每個窗口由基於QObject的C++後端和基於qml的界面組成。每個窗口都需要連接到核心類發出的一堆信號。 當前的解決方案是從QQuickView導出窗口,連接信號並使用setSource()加載qml。這是一種正確的方式還是有更好的方法? 對所有窗口使用一個QQmlEngine(並且將此引擎用作每個窗口的父項)還是爲每個新窗口創建新引擎會更好?正確的方式動態創建qml窗口

+0

你說的動態是什麼意思?你會有一個QObject的變量列表,並且每個都需要一個窗口嗎? – GrecKo

+0

@GrecKo是,列表中的每個QObject都有一個窗口(使用相同的qml文件)的QObjects列表。核心類需要能夠在運行時添加和/或刪除對象(和窗口)。 –

回答

1

爲此,我會將c++ model公開給QML代碼。 既然這個模型是動態的(元素可以被添加或刪除),我會使用一個QAbstractItemModel派生模型,它可以通知視圖添加/刪除了一些元素。使用其他類似QList<QObject*>的意思是,您必須告訴視圖,每次更改後應重新加載整個模型。

您可以使用類似QQmlObjectListModel from Qt QML Tricks的類,而不是從頭開始實現該模型,它從C++公開類似QList的API,但是將QObject屬性暴露爲場景下的角色。

,如果你不希望使用的QObject,你可以用另一種解決方案是benlau's QSyncable(其實我已經在類似的情況,以你的,用這個地方我暴露我的屏幕在模型和實例化一個Window顯示任務欄爲每個)。

然後,我會使用一個QQmlApplicationEngine並使用setContextProperty將模型暴露給它。 A QQuickView已經是一個窗口,所以我不認爲你想使用它,最好是在QML代碼中手動管理你的Windows。

在QML代碼

然後,使用一個Instantiator爲你的根對象,設置模型,並使用Window作爲其代表:

Instantiator { 
    model: yourModel 
    Window { 
     /* ... */ 
    } 
} 
+0

這種方法可以支持不同類型的窗口嗎?而且我還需要窗口集可保存並可加載以保存和恢復程序會話,我該如何使用這種方法來做到這一點? –

+0

我擔心這會讓你的問題過於寬泛。有很多方法來保存和加載窗口狀態:使用設置,本地數據庫,一些自定義序列化,...至於支持不同類型的窗口,它可能意味着很多事情。 – GrecKo

+1

感謝您的回答,經過一番研究和一些原型設計後,我得出結論,這種方法確實是我所描述的情況的最佳選擇。不幸的是,QML窗口並不適合應用程序的整個概念,所以我想我會在我的軟件中切換回小部件。但是再次感謝你的答案。 –