如何创建在 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 } }
无模式模型
如果您需要更大的灵活性,您可以创建无模式模型允许具有任意属性的对象。要实现此目的:
使用列表
这是一个示例支持各种对象类型的通用列表模型:
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中文网其他相关文章!