Qt::UserRole的作用

Qt::UserRole相当于一个索引的作用,对于一些Qt的组件有一个参数位置就需要Qt::UserRole

void QComboBox::setItemData ( int index, const QVariant & value, int role = Qt::UserRole );
bool QStandardItemModel::setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole );

就例如使用一个QListWidget,里面有多个QListWidgetItem

本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓ 

你给每一个item存放了一些数据

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QListWidget *pListWidget = new QListWidget(this);
    int i = 0;
    do {
    ++i;
    QListWidgetItem *pItem = new QListWidgetItem(pListWidget);
    pItem->setData(Qt::UserRole, i); // 用户数据
    pItem->setData(Qt::UserRole+1, i+1000); // 用户数据(取不到)
    pItem->setData(Qt::UserRole + 1, QString("Qter %1").arg(i)); // 用户数据
    pItem->setData(Qt::UserRole + 2, QString("取不到 %1").arg(i));
    pItem->setText(QString("Item %1").arg(i)); // 文本
    pListWidget->addItem(pItem);
    } while (i < 5);
    // 连接信号槽
    connect(pListWidget, &QListWidget::itemClicked, this, &MainWindow::onItemClicked);
}

如果点击到某个item就会触发对应的事件onItemClicked

void onItemClicked(QListWidgetItem *item)
{
    int nID = item->data(Qt::UserRole).toInt(); // 获取用户数据
    QString strName = item->data(Qt::UserRole + 1).toString(); // 获取用户数据
    qDebug() << "UserRole: " << Qt::UserRole;
    qDebug() << "ID : " << nID;
    qDebug() << "Name : " << strName;
}

通过我们存放数据的时候采用的“标识”——“Qt::UserRole”来获取数据

除了这样采用一个id存放一个基本数据类型(一个用户如果有好多信息那就需要好多id),你可以采用结构体方式把用户数据放在一个结构体中,这样只需要一个id

// 用户信息
 
struct User : QObjectUserData {
 
int nID; // ID
 
QString strName; // 用户名
 
};
 
 
// 语言
 
typedef enum{
 
UI_ZH, // 中文
 
UI_EN // 英文
 
} LANGUAGE;
 
 
Q_DECLARE_METATYPE(User)
 
Q_DECLARE_METATYPE(LANGUAGE)
/*
其中,User定义为QObjectUserData类型,为了后面setUserData()和userData()使用。如果不使用这两个接口,则不需要定义为QObjectUserData。

绝大部分存储用户数据的接口都使用的是QVariant,也就是我们常说的“万能变量”。对于自定义数据类型,如果要使用QVariant,就必须使用Q_DECLARE_METATYPE注册。
*/
QListWidget *pListWidget = new QListWidget(this);
 
int i = 0;
 
do {
 
++i;
 
QListWidgetItem *pItem = new QListWidgetItem(pListWidget);
 
User user;
 
user.nID = i;
 
user.strName = QString("Qter %1").arg(i);
 
pItem->setData(Qt::UserRole, QVariant::fromValue(user)); // 设置用户数据
 
pItem->setText(QString("Item %1").arg(i));
 
pListWidget->addItem(pItem);
 
} while (i < 5);


void onItemClicked(QListWidgetItem *item)
 
{
QVariant variant = item->data(Qt::UserRole); // 获取用户数据
 
User user = variant.value<User>();
 
qDebug() << "ID : " << user.nID; qDebug() << "Name : " << user.strName;
 
}

 文章转自博客园(kongbursi):https://www.cnblogs.com/kongbursi-2292702937/p/15007105.html

 本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值