当使用C ++ QAbstractListModel时,为什么我需要`text:model.display.foo`而不仅仅是`text:foo`?

时间:2015-07-19 00:06:31

标签: qt qml qt5 qtquick2

我用Qt / QtQuick 非常新的。

我使用Qt Designer设计了a simple form,它由ListView唯一组成。

Item {
    // ... 
    ListView {
        id: listView1
        anchors.fill: parent
        model: FooModel
        delegate: Item {
            // ... 
            Row {
                id: row1
                Text {
                    text: foo
                    // ... 
                }
            }
        }
    }
}

这适用于以下内容 - 通过将其内联复制粘贴为model,或让qmlscene或Qt Designer注意dummydata中包含的FooModel.qml

ListModel {
    ListElement {
        foo: "1"
    }

    ListElement {
        foo: "2"
    }

    ListElement {
        foo: "3"
    }

    ListElement {
        foo: "4"
    }
}

然而,当我尝试用QAbstractListModel子类text: foo替换我的虚拟模型时,我必须将text: model.display.foo替换为delegate in { delegate: Item { // ... Row { id: row1 Text { text: model.display.foo // <=== See? // ... } } }

FooListModel* flm= new FooListModel();
QQmlContext *ctxt = engine.rootContext();
ctxt->setContextProperty("FooModel", flm);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();

如果我不这样做,Qt会抱怨

  

qrc:/MainForm.ui.qml:23:ReferenceError:未定义foo

并且没有显示任何内容。

我设置了这样的模型属性,an actual C++ model

text

为什么会这样?

另外 - 假设“这是一个功能而不是错误” - 必须更改schoolid/chilidid属性意味着我不能再在QtDesigner中拥有我的虚拟数据或使用内联模型进行原型设计; 我能以任何方式避免这种情况吗?

请找到有问题的MWE in my main.cpp

1 个答案:

答案 0 :(得分:2)

qrc:/MainForm.ui.qml:23: ReferenceError: foo is not defined

表示您必须在foo中定义FooListModel个角色。例如,

class FooListModel : public QAbstractListModel
{
public:
    enum FooListModelRoles 
    {
        FooRole = Qt::UserRole + 1,
        BarRole, 
        //...
    }

    QHash<int, QByteArray> roleNames() const //override
    {
        QHash<int, QByteArray> roleName;
        roleName[FooRole] = "foo";  //define "foo" role for QML
        roleName[BarRole] = "bar";  //define "bar" role for QML
        return roleName;
    }

    //...
}

QML中的代表现在可以访问foo角色。

  

另外 - 假设&#34;它是一个功能,而不是一个错误&#34;

是的,text: model.display.foo正常,因为displayQAbstractItemModel中的预定义角色。