首頁 >後端開發 >C++ >如何建立用於 QML 的通用物件模型?

如何建立用於 QML 的通用物件模型?

Linda Hamilton
Linda Hamilton原創
2024-12-28 21:22:12608瀏覽

How to Create a Generic Object Model for Use in QML?

如何建立在 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
    }
}

無模式模型

如果您需要更大的靈活性,您可以建立無模式模型允許具有任意屬性的物件。要實現此目的:

  1. 建立儲存 QObject 的 QAbstractListModel 或 QObject 模型。
  2. 提供回傳物件的單一物件角色。
  3. 使用Loader作為委託,根據物件實例化不同的QML UI實作類型。
  4. 為模型實作 QQmlListProperty 和 Q_CLASSINFO("DefaultProperty", "container"),以允許使用 QML 的聲明性語法進行動態組合。

使用列表

這是一個範例支援各種物件類型的通用清單模型:

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

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