zoukankan      html  css  js  c++  java
  • 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

    你给每一个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/

  • 相关阅读:
    由u盘安装Ubuntu引出的事件
    初试Ubuntu
    从error 中学习
    快手一面:牛客:字符串左移
    快手一面:Leetcode:最小栈
    十三、线程池
    十二、windows临界区、其他各种mutex互斥量
    十一、std::async深入
    LeetCode(703):找出数据流中的第K大元素
    LeetCode(1003):检查替换后的字符串
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/15007105.html
Copyright © 2011-2022 走看看