如何建立在 QML 中使用的通用物件模型
要將 Qt 模型註冊為 QObject 的屬性,您可以使用Q_PROPERTY 巨集。但是,並非所有模型類型都與此方法相容。
使用 AnimalModel
雖然將 QAbstractListModel 直接傳遞到 QML 視圖很常見,但無法註冊它作為 QObject的屬性使用Q_PROPERTY.
建立動態物件模型
要克服此限制,您可以建立一個自訂 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) };
這將建立一個 QObject,其屬性傳回指向 AnimalModel 的指標。然後可以在QML 中存取模型,如下所示:
DataObject { modelAnimals: { // Manipulate the model here } }
無模式模型
如果您需要更大的靈活性,您可以建立無模式模型允許具有任意屬性的物件。要實現此目的:
使用列表
這是一個範例支援各種物件類型的通用清單模型:
class List : public QAbstractListModel { Q_OBJECT QList<QObject *> _data; ... };
您可以使用以下方式註冊此模型:
qmlRegisterType<List>("Core", 1, 0, "List");
並在QML中使用它,如下所示:
List { QtObject { ... } QtObject { ... } List { QtObject { ... } QtObject { ... } } }
動態排序和過濾
為了使這個模型更可用,您可以實現排序和過濾代理:
class SortingFilteringProxy : public QAbstractListModel { Q_OBJECT QSortFilterProxyModel _proxy; ... };
這允許基於所包含物件的任意屬性進行進階過濾和排序功能。
以上是如何建立用於 QML 的通用物件模型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!