qt - Qt5 和 Qt 4.8 中的模型和角色

标签 qt models qml porting 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);
        }
    }

在 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

这是 Quick 1.1
MainModel(0x7fffe58182f0)
undefined
QDeclarativeVisualDataModelData(0x2372ea0)
QVariant(MiniModel*)
QVariant(MiniModel*)

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

附言我在 Qt5 版本中做了一些更改。在 Qt5 方法中 setRoleNames()已过时并覆盖 roleNames()被推荐。我已经完成了这个覆盖。

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

最佳答案

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

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

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

关于qt - Qt5 和 Qt 4.8 中的模型和角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14031462/

相关文章:

linux - 由于 glibc 版本,基于 Qt 的应用程序二进制兼容性问题

python - 使用 Django 模型创建子类别

authentication - 如何为两个设计模型使用不同的 authentication_keys?

qt - 如何更改 Qml 中 ListView 滚动条的位置

Qt - 不要将主要版本号附加到可执行文件/库名称的末尾

qt - Qml 得到解析的字体系列

c++ - 无法将 QString 转换为 QDateTime

ruby-on-rails - 在模型中使用 Rails 助手

c++ - QML 中的类型化数组? QByteArray 到 JS Uint8Array 来回互操作

python - 将 python 字典返回到 QML (PySide2)