Qt::UserRole的作用

2023-11-12

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模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt::UserRole的作用 的相关文章

随机推荐

  • 谁说 AI 编程工具缺乏记忆和联想能力?简单琐碎的需求完全可以交给它

    Amazon CodeWhisperer 是一款 AI 编码配套应用程序 可在 IDE 中生成整行代码和完整的函数代码建议 以帮助您更快地完成更多工作 在本系列文章中 我们将为您详细介绍 Amazon CodeWhisperer 的相关信息
  • 如果虚函数在基类与子类名字相同,而参数类型不同不会进行迟后联编

    class Base public virtual void Show int x cout lt lt In Base class int x lt lt x lt lt endl class Derived public Base pu
  • 2020-08-27

    java 1 编译java程序的命令是javac 该命令的文件是javac exe 2 jsp表达式的写法 3 3 Math round 11 5 为 11 四舍五入是向数值大的方向入 4 float与int做除法运算时 会将int转化为f
  • 基础项目(2)二选一数据选择器的设计

    写在前面的话 数据选择器在数字电路设计中的应用尤为广泛 同时 作为基础的电路功能单元 也比较适合作为初学者的入门实验 现在梦翼师兄陪大家一起来设计一个最基础的数据选择器 项目需求 设计一个二选一数据选择器 然后用一路控制信号选择输出数据选通
  • 区块链中的全节点与轻量级节点

    在加密货币中 凡是连接到该网络的任何计算机 都被称为节点 在区块链中 存在一种冗余备份的现象 就是说 如果所有节点都需要保存全网的所有交易及其他数据信息 则不可避免的会出现一些弊端 比如 用户想创建一个自己的区块链节点进行项目开发 而不需要
  • 华为OD机试 - 返回矩阵中非1的元素个数(Java)

    题目描述 存在一个m n的二维数组 其成员取值范围为0 1 2 其中值为1的元素具备同化特性 每经过1S 将上下左右值为0的元素同化为1 而值为2的元素 免疫同化 将数组所有成员随机初始化为0或2 再将矩阵的 0 0 元素修改成1 在经过足
  • 微信小程序:setdata--数据如何输出到前台

    简介 这一部分我来为大家讲解一下啊 小程序前台wxml页面如何调用后台的数据 其中涉及到的一个方法 setdata 演示 前 wxml
  • Python二级--三国演义分词

    三国演义分词 1 题目一 概述 三国演义 是中国古典四大名著之一 曹操是其中主要人物 考生文件夹下文件data txt给出 三 国演义 简介 问题1 请编写程序 用Python语言中文分词第三方库jieba对文件data txt进行分词 并
  • Flutter SingleChildScrollView要点

    知识要点 SingleChildScrollView类似Android中的ScrollView 只接收一个子组件 SingleChildScrollView this scrollDirection Axis vertical 滚动方向 默
  • Springboot中如何打印sql信息和sql参数信息呢?

    转自 Springboot中如何打印sql信息和sql参数信息呢 下文笔者讲述SpringBoot中设置配置文件 使其可打印出sql信息及参数信息的方法分享 实现思路 springboot打印sql信息及参数 我们可采用修改applicat
  • python:openpyxl基础操作(一):创建.xlsx文件

    目录 前言 安装openpyxl 创建 xlsx文件 添加单元格内容 单个添加 多个添加 增删单元格 遍历表格中的值 合并拆分单元格 前言 本文仅供个人学习记录 复习所用 探索过程中难免出现差错和纰漏 如文中有错误 以及可以改进的地方 还请
  • python中的utils模块_python常用方法utils

    always 目录里主要封装了一些自己常用的方法 1 doc2txt 本函数主要目的是方便在写爬虫的时候遇到word附件 下载后直接提取出文本文件 注意 需要安装antiword mac下 brew install antiword 2 f
  • vue3组件通信方式一

    目录 props 父组件给子组件传递数据 子组件获取父组件传递数据 方式1 子组件获取父组件传递数据 方式2 案例 自定义事件 原生DOM事件 自定义事件 案例 全局事件总线 v model useAttrs 不管是vue2还是vue3 组
  • yolov3测试自己的数据

    yolov3测试自己的数据 前言 上一篇我已经介绍了利用yolov3预训练权重文件 只包含卷积层 并训练 只需要进行如下编译 darknet detector train cfg voc data cfg yolov3 cfg darkne
  • macOS 虚拟桌面黑屏(转)

    转自 macOS重置虚拟桌面 macOS 虚拟桌面黑屏 有几次出现如图的情况 以为是iTerm的问题 但是在关闭软件 重启之后 依旧无效 后面经过网友告知 才知道是虚拟桌面的问题 为了清理这个问题 有以下两种方法 法一 在终端输入以下命令
  • VC++闪退的两种解决方式(1然后选择“开始执行(不调试)“,也就是ctrl+F5;2system(“pause“);)

    这几天将开发集成环境换成了vs2010 刚开始用 有些地方不是很懂 通过查阅相关文档 现得以解决 就拿VS2010 调试窗口一闪而过解决方法如下 cpp view plain copy include
  • DAY2:leetcode977有序数组的平方 209 长度最小的子数组 59螺旋矩阵

    一 双指针法 O n 时间复杂度 有序数组的平方 一维数组初始化 vector
  • RTP时间戳概念

    RTP协议不依赖于底层协议 由于UDP包的快速 时实性高的特点 它通常和UDP结合在一起 作为UDP的上层载体数据的形式传播 typedef struct rtp header t uint32 t v 2 protocol version
  • Python基础(3)——PyCharm介绍

    Python基础 3 PyCharm介绍 文章目录 Python基础 3 PyCharm介绍 课程目标 一 PyCharm的作用 二 下载和安装 2 1 下载 2 2 安装 三 PyCharm基本使用 3 1 新建项目 3 2 新建文件并书
  • Qt::UserRole的作用

    Qt UserRole相当于一个索引的作用 对于一些Qt的组件有一个参数位置就需要Qt UserRole void QComboBox setItemData int index const QVariant value int role