将QList <type *>绑定到QListView

时间:2015-07-28 00:29:15

标签: c++ qml qt5 qlistview qlist

我有一个名为Patients的自定义类型(请忽略复数错误)。我想在我的cpp中创建一个QList<Patients*>并从我的QML中使用它。我正在关注here的模式,但它无效。

这是我的Patients.h(可能比需要的更多信息)。 。

class Patients : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString name READ getName)
    Q_PROPERTY(QString email READ getEmail)
    Q_PROPERTY(int id READ getId)

public:
    explicit Patients(QObject *parent = 0);
    explicit Patients(int id, QString name, QString email, QObject *parent = 0);

    QString getName() const;
    QString getEmail() const;
    int getId() const;

private:
    QString email, name;
    int id;
}; 

这是主要的cpp

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QQmlApplicationEngine engine;

    QList<Patients*> lst;
    lst.append(new Patients(0, QString("abe"), QString("albert")));
    QQmlContext *ctx = engine.rootContext();
    ctx->setContextProperty("pLst", QVariant::fromValue(lst));

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}

这是qml。 。 。

ListView{
    id: lst
    height: 100; width: 100
    anchors.fill: parent
    x: 100; y: 100

    model: pLst
    delegate: Text{
        text: model.modelData.name
    }
}

当我绑定单个对象时,它可以工作,但不能作为列表。即使在index内展示Text也行不通。没有错误消息或任何内容。

3 个答案:

答案 0 :(得分:3)

QML中的QList容器没有普遍支持,即使它所持有的类型已注册到Qt的元系统。默认情况下支持某些特殊变体(例如QStringList QList<QObject*>),因此如果您的类派生自QList<QObject*>,则可以使用QObject

如果您的类型不是来自QObject,或者您希望保持C ++中的界面干净且类型安全,我建议使用QQmlListProperty。请注意,如果您不想在QML中修改列表,则不必实施append()clear()方法。

答案 1 :(得分:0)

事实证明我必须将列表声明为

QList<QObject*> lst;

答案 2 :(得分:0)

您将使用QQmlListProperty定义新类,并定义容器数据对象(此类将继承自QObject),在QQmlListProperty类中您将定义容器{{ 1}} QList的指针。我写了两篇关于这个主题的帖子:

Show, change data and keep QQmlListProperty in qml

Use QQmlListProperty to show and modify QList in Qml