Rumah > pembangunan bahagian belakang > C++ > Bolehkah Model Qt Didaftarkan sebagai Sifat QObjects?

Bolehkah Model Qt Didaftarkan sebagai Sifat QObjects?

Barbara Streisand
Lepaskan: 2024-12-24 18:34:04
asal
794 orang telah melayarinya

Can Qt Models Be Registered as Properties of QObjects?

Bolehkah Model Qt Didaftarkan sebagai Sifat QObjects?

Untuk bermula, mari jelaskan bahawa model Qt sememangnya boleh didaftarkan sebagai sifat QObjects menggunakan makro. Sebagai contoh, pertimbangkan AnimalModel dari sini:

http://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html#qabstractitemmodel
Salin selepas log masuk

Meluluskan Model ke Konteks Root

Melalukan model kepada konteks akar QuickView ialah kaedah yang mudah. Berikut ialah contoh:

QuickView view;
view.rootContext()->setContextProperty("myModel", &model); // where "model" is the AnimalModel
Salin selepas log masuk

Begitu juga, objek yang didaftarkan melalui makro Qml boleh ditambah pada paparan:

view.rootContext()->setContextProperty("obj", pDataObject);
Salin selepas log masuk

QObject dengan Ciri Model

Bagaimanapun, bagaimana jika anda mahukan QObject yang mengandungi model mana-mana jenis data? Berikut ialah contoh pelaksanaan:

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)
};
Salin selepas log masuk

Bertentangan dengan ulasan, pendaftaran hartanah ini sememangnya mungkin, tetapi bukannya AnimalModel, ia akan menjadi AnimalModel *. Selagi model mewarisi daripada QAbstractListModel, anda tidak memerlukan bahagian NOTIFY. Perubahan dalam model ditunjukkan secara automatik.

Pelaksanaan Model Fleksibel

Pendekatan yang lebih fleksibel ialah mencipta model yang menyimpan QObject *. Daripada QML, anda boleh mencipta pelbagai objek dengan pelbagai sifat dan memasukkannya ke dalam model. Model kemudiannya menyediakan satu peranan yang mengembalikan objek, membolehkan anda membuat pertanyaan dan menggunakan sifatnya.

Model Tanpa Skema

Selain itu, anda boleh melaksanakan model "tanpa skema" dengan menggunakan QQmlListProperty dan Q_CLASSINFO("DefaultProperty", "container"). Ini membolehkan anda mengarang model secara dinamik atau menggunakan sintaks deklaratif QML. Yang penting, pendekatan ini juga menyediakan keupayaan untuk menambah atau mengalih keluar objek secara deklaratif.

Contoh Model dengan Data Dinamik

Berikut ialah contoh pelaksanaan model yang menyokong mana-mana jenis data:

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 ...
};
Salin selepas log masuk

Model ini boleh digunakan untuk memegang mana-mana QObject atau kelas terbitan, termasuk QtObject QML. Ia boleh berfungsi sebagai model untuk ListView dan menyokong populasi dinamik melalui slot atau sintaks deklaratif. Tambahan pula, ia mengendalikan pemilikan objek dan boleh disarangkan untuk mencipta model pokok berpetak.

Pemuat untuk Perwakilan

Untuk memaparkan jenis objek yang berbeza dalam paparan, anda boleh menggunakan Pemuat untuk perwakilan yang memuatkan fail QML yang sesuai berdasarkan objek taip.

Proksi Isih dan Penapisan Generik

Untuk meningkatkan kebolehgunaan model di atas, anda juga boleh melaksanakan proksi pengisihan dan penapisan generik yang ringkas dan dinamik. Berikut ialah contoh intipati pelaksanaan:

https://gist.github.com/gabor-boros/9e756b6dba5011c0286069feedbd3cc8
Salin selepas log masuk

Atas ialah kandungan terperinci Bolehkah Model Qt Didaftarkan sebagai Sifat QObjects?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan