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; }
参考链接:https://blog.csdn.net/sajdhfkjidkgjo/article/details/104685538/