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
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
Begitu juga, objek yang didaftarkan melalui makro Qml boleh ditambah pada paparan:
view.rootContext()->setContextProperty("obj", pDataObject);
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) };
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 ... };
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
Atas ialah kandungan terperinci Bolehkah Model Qt Didaftarkan sebagai Sifat QObjects?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!