Qt5 和 Qt 4.8 中的模型和角色

Posted

技术标签:

【中文标题】Qt5 和 Qt 4.8 中的模型和角色【英文标题】:Models and roles in Qt5 and Qt 4.8 【发布时间】:2012-12-25 14:24:44 【问题描述】:

今天我想玩一点 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 Qt5 和 for Qt 4.8。我希望你能帮助我找到问题的核心。

附:我在 Qt5 版本中做了一些更改。在 Qt5 方法中,setRoleNames() 已过时,建议覆盖 roleNames()。我已经完成了这个覆盖。

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

【问题讨论】:

您的 Qt5 代码无法编译。 trollixx,如果你在谈论'MiniModel' : illegal member initialization 它不知道。我在 GNU/Linux x64 上进行了测试。我需要一些时间来调查 MSVC 编译器出了什么问题。 Ubuntu Linux x86_64, g++ 4.6.3. 【参考方案1】:

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

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

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

【讨论】:

以上是关于Qt5 和 Qt 4.8 中的模型和角色的主要内容,如果未能解决你的问题,请参考以下文章

如何根据用户在 Laravel 5 中的角色选择用户?

django模型中的角色

在Visual Studio 2013中是否有用于调试Qt 4.8项目的非官方可视化工具?

在 Qt 中使用不同模型访问另一个列表视图的委托中的列表视图模型数据

将 Qt 4.8 转换为 5 QPluginLoader->instance 返回 null

Qt Quick 从角色返回对象