【QT】Qt::UserRole的作用
Qt 作用
2023-09-11 14:16:59 时间
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
给每一个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;
}
相关文章
- QT开发:QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection'...
- Qt中使用DOM解析XML文件或者字符串(实例)
- qt中的进程优先级及应用内存大小设置方法,VS和Qt工程中申请超过2G的内存的方法
- Qt中exec函数的作用
- Qt 事件处理机制-qt源码解读
- qt 消息处理机制与window消息处理机制的比较
- 解决qt程序运行时的cannot create Qt for Embedded Linux data directory: /tmp/qtembedded-0出错情形
- 【QT】Qt项目demo:数据在ui界面上显示,鼠标双击可弹窗显示具体信息
- 【QT】Qt使用QJson生成json文件并保存
- 【QT】对于Qt MSVC 2017无法编译的问题解决
- 【QT】Qt 5 的程序:打印文档
- 基于QT(C++)实现(图形界面)选课管理系统【100010320】
- Qt数据库应用9-数据导出组件使用方法
- Qt编写地图综合应用19-地图服务
- Qt编写安防视频监控系统3-通道交换
- Qt编写自定义控件5-柱状温度计
- 解析Qt元对象系统(五) Q_INVOKABLE与invokeMethod(automatic connection从Qt4.8开始的解释已经与之前不同,发送对象驻足于哪一个线程并不重要,起到决定作用的是接收者对象所驻足的线程以及发射信号(该信号与接受者连接)的线程是不是在同一个线程)good
- Qt多线程学习-用例子来理解多线程(转),这个是我看过最好的文章,总结很详细(感觉exec()的作用就是保持线程不退出,这样方便随时处理主线程发来的信号,是一种非常别致的思路)good
- 创建Qt Quick项目
- 【转】 Qt如何设置自动补全快捷键