ホームページ >バックエンド開発 >C++ >QtモデルをQObjectsのプロパティとして登録できますか?

QtモデルをQObjectsのプロパティとして登録できますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-24 18:34:04801ブラウズ

Can Qt Models Be Registered as Properties of QObjects?

Qt モデルは QObjects のプロパティとして登録できますか?

まず、Qt モデルは実際に QObjects のプロパティとして登録できることを明確にしましょうマクロを使用して。たとえば、ここから 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 with Model Properties

しかし、任意のタイプのデータのモデルを含む 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 のモデルとして機能し、スロットまたは宣言構文を介した動的な作成をサポートします。さらに、オブジェクトの所有権を処理し、ネストして区分化されたツリー モデルを作成できます。

Loader for Delegate

ビューにさまざまなオブジェクト タイプを表示するには、次を利用できます。オブジェクトの内容に基づいて適切な QML ファイルをロードするデリゲートのローダーtype.

汎用並べ替えおよびフィルター プロキシ

上記のモデルの使いやすさを向上させるために、シンプルで動的な汎用並べ替えおよびフィルター プロキシを実装することもできます。実装の要点例は次のとおりです:

https://gist.github.com/gabor-boros/9e756b6dba5011c0286069feedbd3cc8

以上がQtモデルをQObjectsのプロパティとして登録できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。