【发布时间】:2018-10-16 11:52:40
【问题描述】:
我有一个非常简单的类,有 2 个属性;键和值:
KeyValue.h:
class KeyValue : public QObject
{
Q_OBJECT
Q_PROPERTY(QString key READ getKey WRITE setKey NOTIFY keyChanged)
Q_PROPERTY(QString value READ getValue WRITE setValue NOTIFY valueChanged)
public:
KeyValue(const QString& key, const QString& value, QObject* parent = 0);
signals:
void keyChanged();
void valueChanged();
private:
QString _key;
QString _value;
QString getKey() const;
QString getValue() const;
void setKey(const QString& key);
void setValue(const QString& value);
};
Q_DECLARE_METATYPE(KeyValue)
在另一个类中,我想要一个包含 KeyValue 对象列表的属性,因此我可以将此列表用作 QML 中的模型。
Controller.h
class Controller : public QObject
{
Q_OBJECT
Q_PROPERTY(QList<KeyValue*> items READ getItems NOTIFY itemsChanged)
public:
explicit Controller(QObject* parent = 0);
signals:
void itemsChanged();
private:
QList<KeyValue*> getItems() const;
};
我希望能够通过以下方式在 QML 中使用它:
import QtQuick 2.7
import customqml 1.0
Item{
Controller{
id: controller
}
Repeater{
model: controller.items
Text{
text: modelData.key + ": " + modelData.value
}
}
}
这两个类都在我的 main.cpp 文件中注册:
qmlRegisterType<KeyValue>("customqml", 1, 0, "KeyValue");
qmlRegisterType<Controller>("customqml", 1, 0, "Controller");
上面的代码不起作用,因为我显然不能将 QList 直接暴露给 QML。我曾尝试使用 QAbstractItemModel 和 QQmlListProperty,但我无法让它工作。谁能指出我正确的方向?
我的主要问题是控制器类中 items 属性的类型和 getItems 方法的返回值。
如果这有什么不同的话,我正在使用 Qt 5.9。
【问题讨论】:
-
您可以使用
QVariantList。但既然你想在 QML 中使用它作为模型,你应该使用QAbstractListModel-descendent。 QQmlObjectListModel 使用起来非常舒服,您可以在此处找到:github.com/Cavewhere/lib-qt-qml-tricks/tree/master/include 免责声明:我不是作者,只是一个用户。 在Q_DECLARE_METATYPE(KeyValueList)和相应的 typedef 之后也可能会这样做,但是我可能错了。 -
请阅读doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html你可以使用QObjectList或QVariantList,或子类QAbstractItemModel。
-
感谢@derM 的链接。我没有直接使用那个模型,但是源代码给了我很大的启发