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

role,也就是俗称的角色.

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

Qt RoleQML Role Name
Qt::DisplayRoledisplay
Qt::DecorationRoledecoration
Qt::EditRoleedit
Qt::ToolTipRoletoolTip
Qt::StatusTipRolestatusTip
Qt::WhatsThisRolewhatsThis

##自定义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.

转载于:https://my.oschina.net/jannn/blog/661780

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值