Qt5和Qt 4.8中的模型和角色

Kak*_*adu 5 qt porting models qml qt5

今天我想和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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

在Qt4.8中,我能够使用roleName语法获取数据(在此QML中我的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
Run Code Online (Sandbox Code Playgroud)

这就是Quick 1.1

MainModel(0x7fffe58182f0)
undefined
QDeclarativeVisualDataModelData(0x2372ea0)
QVariant(MiniModel*)
QVariant(MiniModel*)
Run Code Online (Sandbox Code Playgroud)

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

PS我在Qt5版本上做了一些改动.在Qt5中,方法setRoleNames()已过时,roleNames()建议覆盖.我做了这个压倒一切.

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

Ole*_*ber 3

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

virtual QHash<int, QByteArray> roleNames() const { return _roles; }
Run Code Online (Sandbox Code Playgroud)

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