5

今天我想稍微玩一下QtQuick2。所以我开始将非常简单的 Qt Quick1 应用程序移植到 Quick2。这个应用程序使用了一些模型。在 Qt5 中,模型无法按我的预期工作:我无法使用角色访问数据。

这是我的 QML 代码:

import QtQuick 2.0

Rectangle {
width: 800
height: 360

ListView {
    model: mainModel
    spacing: 5
    anchors.fill: parent
    orientation: ListView.Vertical
    delegate: Text {
        text: "1"

        Component.onCompleted: {
            console.log(mainModel);
            console.log(mainModel.roles() );
            console.log(model);
            console.log(model.homm); // `homm` is my roleName
            console.log(homm);
        }
    }

在 Qt4.8 中,我能够使用roleName语法(在此 QML 中 my roleName= homm)获取数据,但在 Qt5 中我不能。这就是控制台中写的内容:

MainModel(0x7fff08beff80)
homm,wtf
QQuickVDMAbstractItemModelData(0x23c96e0)
undefined
file:///media/disk/kakadu/prog/qt/quick2test/qml/quick2test/main.qml:20: ReferenceError: homm is not defined

这就是 Quick 1.1

MainModel(0x7fffe58182f0)
undefined
QDeclarativeVisualDataModelData(0x2372ea0)
QVariant(MiniModel*)
QVariant(MiniModel*)

如您所见,使用角色访问数据按预期工作。我为您创建了测试应用程序: 用于 Qt5Qt 4.8。我希望你能帮助我找到物质的核心。

PS 我在 Qt5 版本中做了一些改动。在 Qt5 中,方法setRoleNames()已过时,roleNames()建议覆盖 of。我已经做到了这一点。

PPS 我的代码示例应该可以在 GNU/Linux x64 上编译

4

1 回答 1

3

我在你的代码中发现了一个错误。roleNames()是常数法。这是一行有效的代码:

virtual QHash<int, QByteArray> roleNames() const { return _roles; }

还有一个工作示例:examples/quick/modelviews/abstractitemmodel。

于 2012-12-26T10:49:50.157 回答