我正在處理Qt應用程序,我需要動態創建窗口。每個窗口由基於QObject的C++後端和基於qml的界面組成。每個窗口都需要連接到核心類發出的一堆信號。 當前的解決方案是從QQuickView
導出窗口,連接信號並使用setSource()
加載qml。這是一種正確的方式還是有更好的方法? 對所有窗口使用一個QQmlEngine
(並且將此引擎用作每個窗口的父項)還是爲每個新窗口創建新引擎會更好?正確的方式動態創建qml窗口
回答
爲此,我會將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。
然後,使用一個Instantiator
爲你的根對象,設置模型,並使用Window
作爲其代表:
Instantiator {
model: yourModel
Window {
/* ... */
}
}
這種方法可以支持不同類型的窗口嗎?而且我還需要窗口集可保存並可加載以保存和恢復程序會話,我該如何使用這種方法來做到這一點? –
我擔心這會讓你的問題過於寬泛。有很多方法來保存和加載窗口狀態:使用設置,本地數據庫,一些自定義序列化,...至於支持不同類型的窗口,它可能意味着很多事情。 – GrecKo
感謝您的回答,經過一番研究和一些原型設計後,我得出結論,這種方法確實是我所描述的情況的最佳選擇。不幸的是,QML窗口並不適合應用程序的整個概念,所以我想我會在我的軟件中切換回小部件。但是再次感謝你的答案。 –
- 1. Qt沒有正確顯示QML窗口
- 2. 創建QML美國動態
- 3. QML動態組件創建
- 4. 使用QML創建新窗口
- 5. 如何從QML內創建新窗口?
- 6. 使用getBean()動態創建Bean的正確方式
- 7. 正確的方式來動態決定創建哪個類
- 8. 編程方式創建的窗口不顯示爲正確的尺寸
- 9. QML:拖動無框窗口
- 10. Java Swing - 創建動態窗口
- 11. 在窗口中創建動態按鈕
- 12. 使用qml創建手風琴控制的正確方法
- 13. 如何添加彈出窗口/模式,動態創建的表
- 14. @創建模態窗口
- 15. Resize Qml窗口
- 16. 從動態創建的頁面動態創建彈出窗口 - Mysql
- 17. QML動態創建工具提示
- 18. QML - 動態創建ListModel(JAVASCRIPT問題)
- 19. 動態創建QML ObjectModel元素
- 20. 正確的方式抓創建例外
- 21. 創建以特定方式動畫的通知彈出窗口?
- 22. 動態創建HTML模式窗口按鈕
- 23. 使用AngularJS創建動態彈出窗口模式
- 24. 創建方形窗口C++
- 25. 簡明的編譯方式動態創建正則表達式
- 26. 如何確保動態創建的窗體將成爲窗口進程樹中的子窗口?
- 27. 什麼是動態創建UIView內容的正確方法?
- 28. 動態創建對象的正確Java方法是什麼?
- 29. 在Ansible中創建動態列表的正確方法
- 30. 動態創建新類的正確方法是什麼?
你說的動態是什麼意思?你會有一個QObject的變量列表,並且每個都需要一個窗口嗎? – GrecKo
@GrecKo是,列表中的每個QObject都有一個窗口(使用相同的qml文件)的QObjects列表。核心類需要能夠在運行時添加和/或刪除對象(和窗口)。 –