代码之家  ›  专栏  ›  技术社区  ›  iHowell

QList<QString>未被QML ListView用作模型

  •  1
  • iHowell  · 技术社区  · 6 年前

    我有一个 Q_PROPERTY 类型 QList<QString> 在一个 c++ 在QML中未显示的类。这堂课看起来是这样的:

    class FooView : public QQuickItem
    {
        Q_OBJECT;
        Q_PROPERTY(QList<QString> myStrings READ myStrings NOTIFY myStringsChanged);
    
    private:
        QList<QString> m_strings;
    
    public:
        FooView(QQuickItem * parent) : QQuickItem(parent), m_strings() {
            m_strings << "String one" << "String two";
        }
    
        QList<QString> myStrings() const {
            return m_strings;
        }
    
    signals:
        void myStringsChanged();
    };
    

    qmlRegisterType . 我试图将该属性用作 ListView

    FooView {
        id: 'foo'
        ListView {
            anchors.fill: parent
            model: foo.myStrings
            delegate: Text {
                text: "Hi" // to be replaced with foo.myStrings[index]
            }
        }
    }
    

    你能不能不用 QList<QString> 是模特吗?我以为你可以,因为它被列为一个简单的列表类型。

    1 回复  |  直到 6 年前
        1
  •  2
  •   eyllanesc Yonghwan Shin    6 年前

    首次使用 QStringList 而不是 QList<QString> :

    class FooView : public QQuickItem
    {
        Q_OBJECT
        Q_PROPERTY(QStringList myStrings READ myStrings NOTIFY myStringsChanged)
        QStringList m_strings;
    public:
        FooView(QQuickItem * parent=nullptr) :
            QQuickItem(parent)
        {
            m_strings << "String one" << "String two";
        }
        QStringList myStrings() const {
            return m_strings;
        }
    signals:
        void myStringsChanged();
    };
    

    要解决这个问题,你必须使用 modelData 当模型是由 docs

    没有命名角色的模型(例如 将通过modelData角色提供数据。这个 还为只有一个角色的模型提供了modelData角色。在


    FooView {
        id: foo
        anchors.fill: parent
        ListView {
            anchors.fill: parent
            model: foo.myStrings
            delegate: Text {
                text: modelData
            }
        }
    }