文档章节

Qt Model/View/Delegate浅谈 - roleNames()

j
 jannn
发布于 2016/04/18 15:14
字数 431
阅读 499
收藏 1

role,也就是俗称的角色.

##roleNames()函数介绍及默认值 roleNames()函数返回一个model的所有角色名称. 在Qt中默认的角色名称如下:

Qt Role QML Role Name
Qt::DisplayRole display
Qt::DecorationRole decoration
Qt::EditRole edit
Qt::ToolTipRole toolTip
Qt::StatusTipRole statusTip
Qt::WhatsThisRole whatsThis

##自定义roleNames() Qt旧版本中,可以通过setRoleNames()函数来实现自己想要的角色名,

This function is obsolete. Reimplement roleNames() instead.

但是根据Qt5.6.0新版本相关文档的介绍,该函数已经过时,需要通过重新实现roleNames()来替代setRoleNames(). 这意味着:如果我们想要自定义的角色名,则需要重新实现虚函数roleNames().

接下来,我们看看到底如何自定义roleNames():

  • 首先在头文件中添加枚举类型(注意枚举类型命名规则)
//customModel.h

#include <QAbstractItemModel>

class customModel : public QAbstractItemModel
{
    Q_OBJECT
public:
    enum StringListRoles{
        IconRole = Qt::UserRole + 1, //都是Role结尾的
        TextRole = Qt::UserRole + 2,
        UrlRole = Qt::UserRole + 3
    }; 
    explicit customModel(QObject *parent = 0);
    ~customModel();
        
    QHash<int, QByteArray> roleNames() const; //重新实现roleNames()
}
  • 然后重新实现roleNames()
//customModel.cpp

//角色名
QHash<int, QByteArray> customModel::roleNames() const
{
    //这里插入的值需要和前面定义的枚举类型对应
    QHash<int, QByteArray> roleNames;
    roleNames.insert(customModel::IconRole, QByteArray("icon"));
    roleNames.insert(customModel::TextRole, QByteArray("text"));
    roleNames.insert(customModel::UrlRole, QByteArray("url"));
    return roleNames;
}

然后就可以自由使用自己想要的role了.

注意: QListView & QTreeView & QTableView等视图默认使用的是Qt里roleNames()返回的默认角色,所以如果想要视图识别和读取自定义的角色名,还要重新实现对应的delegate.

© 著作权归作者所有

j
粉丝 10
博文 66
码字总数 20006
作品 0
温州
程序员
私信 提问
SendMessage delegate

我们知道Unity3D自身有SendMessage向对象之间发送消息,但这个消耗是比较大的,因为它很大程度上涉及了Reflection发射机制。 如何变更思路,结合C#自带的消息系统delegate委托事件,对此进行...

咖啡伴侣
2014/05/29
68
0
Qt的MVC设计模式——InterView框架(MVD)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_39743893/article/details/80625759 英雄不问,饮水...

shzwork
前天
17
0
iOS如何利用Delegate来实现两个UIView之间的传值

两个View之间的传值可以有多种方式。但本人觉得最合理最自然并且最安全的方式是通过Delegate方式。 设想一个场景: 1. 有两个View,分别是A和B。 2. 点击A中的某个按钮,出来B。 3. 对B做某些...

黑衣李白
2013/01/05
2K
0
大道至简 | MVC+delegate,架构的方式,简单点

写在前面 MVC架构模式和delegate设计模式是我们最熟悉的架构模式和设计模式,正确运用它们可以轻而易举的将复杂页面打造得简洁明了、层次分明,下面就分享下我的一点心得。 关于MVC 起初,我...

无夜之星辰
2018/05/05
0
0
UI_03 ⾃定义视图、视图控制器

⼀、⾃定义label-textField视图 自定义LTView类,封装UILabel与UITextField,实现快速创建以下类型的视图 **** 使用UIView子类实现 **** LTView.h #import <UIKit/UIKit.h> @interf...

黑伞将军
2015/08/18
111
0

没有更多内容

加载失败,请刷新页面

加载更多

服务器性能监控之New Relic 入门教程

New Relic 是一个很强大的服务器性能监控工具,New Relic目前专注于SaaS和App性能管理业务,它支持支持agent和API传送数据,能够对部署在本地或在云中的web应用程序进行监控、故障修复、诊断...

xiaolyuh
13分钟前
3
0
SpringBoot 集成ElasticSearch

一、ElasticSearch介绍 ElasticSearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库——无论是开源...

zw965
38分钟前
5
0
【JVM学习】2.Java虚拟机运行时数据区

来源: 公众号: 猿人谷 这里我们先说句题外话,相信大家在面试中经常被问到介绍Java内存模型,我在面试别人时也会经常问这个问题。但是,往往都会令我比较尴尬,我还话音未落,面试者就会“...

物种起源-达尔文
46分钟前
4
0
dart datetime

var date = DateTime.now().toUtc(); //格式化输出 String timestamp = "${date.year.toString()}-${date.month.toString().padLeft(2, '0')}-${date.day.toString().padLeft(2, ......

zdglf
今天
21
0
如何在Linux中复制文档

在办公室里复印文档过去需要专门的员工与机器。如今,复制是电脑用户无需多加思考的任务。在电脑里复制数据是如此微不足道的事,以致于你还没有意识到复制就发生了,例如当拖动文档到外部硬盘...

老孟的Linux私房菜
今天
50
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部