从向量字符串创建ListView / ListModel

时间:2019-03-18 13:44:14

标签: qt qml

序言

QAbstractListModel可能是一个解决方案,但我认为这对我来说有点过分了……不确定

简介

我正在C ++中制作一个可从QML内部访问的向量:

class MyClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QVector<QString> items READ items WRITE setItems NOTIFY itemsChanged)
    // ...
}

经过测试,我可以从QML中访问矢量:

console.log("myClass.items >>> ", myClass.items) // Logs vector of strings

问题

在我的QML UI上,我打算显示向量内的字符串列表。我尝试使用ListModelListView,但我不知道该怎么做。有人可以帮忙吗?

    ListModel {
        id: myListModel
        // How to compose my model here according to vector of strings
        // i.e. myClass.items
    }

    ListView {
        model: myListModel
        delegate: {
            // ... show the strings inside the vector
        }
    }

更新

按照@Amfasis和@mohabouje的建议,我像这样修改了我的代码,但是由于某些原因它工作。

C ++方面:

class MyClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QStringList items READ items WRITE setItems NOTIFY itemsChanged)
    //...
}

QML方面:

            Row {
                ListView {
                    id: items
                    model: myClass.items // Directly connect to C++ string list
                    delegate: Text {
                        text: modelData // Strings are NOT displayed on QML UI
                                        // Log of modelData shows it is empty
                    }
                }
            }

在QML上,我登录myClass.items,然后看到我的字符串列表:

console.log("myClass.items >>> ", myClass.items)
// logs:
// qml: myClass.items >>>  [item 0,item 1,item 2]

最终固定

设置或修改项目时,我需要emit修改信号,否则将无法正常工作:

m_items = /* set items here */;
emit itemsChanged(m_items); // This is required!

1 个答案:

答案 0 :(得分:2)

您应该向QML引擎公开您的类接口。在这种情况下,您可以将QVector<QString>替换为QStringList

class MyModel: public QObject {
    Q_OBJECT
    Q_PROPERTY(QStringList model READ model NOTIFY modelChanged)
    ...
}; 

如果您查看docs

  

没有命名角色的模型(例如下面显示的ListModel)将具有通过modelData角色提供的数据。还为只有一个角色的模型提供了modelData角色。在这种情况下,modelData角色包含与命名角色相同的数据。

因此,您应该使用属性modelData

ListView {
  model: mymodel.model
  delegate: Text {
     text: modelData
  }
}

要公开您的C ++类,请查看此page