Qt 模型可以註冊為 QObject 的屬性嗎?
首先,讓我們澄清 Qt 模型確實可以註冊為 QObject 的屬性使用巨集。例如,考慮這裡的 AnimalModel:
http://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html#qabstractitemmodel
將模型傳遞到根上下文
將模型傳遞到 QuickView 的根上下文是一種簡單的方法。以下是一個範例:
QuickView view; view.rootContext()->setContextProperty("myModel", &model); // where "model" is the AnimalModel
同樣,透過Qml 巨集註冊的物件可以加入視圖:
view.rootContext()->setContextProperty("obj", pDataObject);
具有模型屬性的QObject
但是,如果您想要一個包含任何類型資料的模型的QObject 該怎麼辦?這是一個範例實作:
class DataObject : public QObject { Q_OBJECT Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged) ... AnimalModel m_modelAnimals; // Q_PROPERTY(AnimalModel modelAnimals READ modelAnimals NOTIFY modelAnimalsChanged) };
與註解相反,這個屬性註冊確實是可能的,但它不是一個 AnimalModel,而是一個 AnimalModel *。只要模型繼承自 QAbstractListModel,就不需要 NOTIFY 部分。模型內的變更會自動反映。
靈活的模型實作
更靈活的方法是建立一個儲存 QObject * 的模型。透過 QML,您可以建立具有各種屬性的不同物件並將它們合併到模型中。然後,模型提供一個傳回物件的角色,讓您可以查詢和利用其屬性。
無模式模型
此外,您可以實作一個使用 QQmlListProperty 和 Q_CLASSINFO("DefaultProperty", "container") 的「無模式」模型。這使您能夠動態地建立模型或使用 QML 的聲明性語法。重要的是,這種方法還提供了以聲明方式新增或刪除物件的能力。
具有動態資料的模型範例
以下是支援任何模型的範例實作資料類型:
class List : public QAbstractListModel { Q_OBJECT QList<QObject *> _data; Q_PROPERTY(int size READ size NOTIFY sizeChanged) Q_PROPERTY(QQmlListProperty<QObject> content READ content) Q_PROPERTY(QObject * parent READ parent WRITE setParent) Q_CLASSINFO("DefaultProperty", "content") public: List(QObject *parent = 0) : QAbstractListModel(parent) { } // rest of the class ... };
此模型可用於保存任何模型QObject 或衍生類別,包括QML 的QtObject。它可以用作 ListView 的模型,並支援透過槽或聲明性語法進行動態填充。此外,它還處理物件所有權,並且可以嵌套以建立分隔的樹模型。
委託載入器
要在視圖中顯示不同的物件類型,您可以使用委託的載入器,根據物件的類型載入適當的 QML 檔案。
通用排序和過濾代理
為了增強上述模型的可用性,您還可以實現一個簡單且動態的通用排序和過濾代理。這是一個範例實作重點:
https://gist.github.com/gabor-boros/9e756b6dba5011c0286069feedbd3cc8
以上是Qt 模型可以註冊為 QObject 的屬性嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!