首頁 >後端開發 >C++ >Qt 模型可以註冊為 QObject 的屬性嗎?

Qt 模型可以註冊為 QObject 的屬性嗎?

Barbara Streisand
Barbara Streisand原創
2024-12-24 18:34:04839瀏覽

Can Qt Models Be Registered as Properties of QObjects?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn