ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Qt 使用setUserData和userData要注意的问题

2021-06-12 10:00:07  阅读:223  来源: 互联网

标签:userData setUserData pBrushCb Qt DHStruct int pCb dh2


在学习Qt的过程中,给界面中存储一些有用的数据,这些数据对于用户来说都是至关重要的,它们在交互过程中大部分都会被用到,例如:单击一个Ui控件,可以获取绑定在控件上的数据。
例子如下
第一步:首先定义需要放在Ui控件中的结构体

struct DHStruct:QObjectUserData
{
    DHStruct()
    {
        index = 0;
        info = nullptr;
        size = QSize(0,0);
        pt = QPoint(0,0);
    }
    int index;
    QString info;
    QSize size;
    QPoint pt;

};
Q_DECLARE_METATYPE(DHStruct)

注意,这里使用派生自QObjectUserData类型,是为了后面能使用QObjectUserData类里的setUserData()和userData()这两个函数。如果不使用这两个接口,则不需要定义为QObjectUserData。
绝大部分存储用户数据的接口都使用的是QVariant,也就是我们常说的“万能变量”。对于自定义数据类型,如果要使用QVariant,就必须使用Q_DECLARE_METATYPE注册。通过添加Q_DECLARE_METATYPE()这个宏让QOject及其子类知道这个类型。

这里要注意的是如果要在队列信号使用或者用用槽连接,要先调用这个函数qRegisterMetaType()
【这里是在运行的时候,对他进行注册】

第二步:组装数据,放到Ui控件中

    ui->setupUi(this);
    QList<DHStruct> list;
    m_pCb = new QComboBox(this);
    m_pCb->addItem(tr("FlatCap"),Qt::FlatCap);
    m_pCb->addItem(tr("SquareCap"),Qt::SquareCap);
    m_pCb->addItem(tr("RoundCap"),Qt::RoundCap);
    m_pCb->addItem(tr("MPenCapStyle"),Qt::MPenCapStyle);
    connect(m_pCb,SIGNAL(activated(int)),this,SLOT(ShowPenStyle(int)));

    DHStruct dh1;
    dh1.pt = QPoint(0,0);
    dh1.size = QSize(10,10);
    dh1.index =2;
    dh1.info = "DHL";
    m_pCb->setUserData(Qt::UserRole,&dh1);//第一种传递:把定义的结构体取地址放进去
    list.append(dh1);

    m_pBrushCb = new QComboBox(this);
    m_pBrushCb->setGeometry(0,50,200,20);
    //m_pBrushCb->addItem(tr("SolidPattern"),static_cast<int>(Qt::SolidPattern));

    DHStruct* dh2 = new DHStruct;
    dh2->pt = m_pBrushCb->pos();
    dh2->size = m_pBrushCb->size();
    dh2->index = 8;
    dh2->info = "达州";
    m_pBrushCb->setUserData(Qt::UserRole,dh2);//第二种传递:把申明的结构体指针对象传递进去
    list.append(*dh2);

第三步:从Ui控件获取刚才放进去的自定义结构体类型

void Widget::ShowPenStyle(int style)
{
   Qt::PenCapStyle value = Qt::PenCapStyle(m_pCb->itemData(m_pCb->currentIndex(),Qt::UserRole).toInt());
   DHStruct* data =  (DHStruct*)m_pCb->userData(Qt::UserRole);//会发现这个data里面数据有乱码

   int j = 0;
}

void Widget::ShowBrushStyle(int value)
{
    Qt::BrushStyle style = Qt::BrushStyle(m_pBrushCb->itemData(value,Qt::UserRole).toInt());
    DHStruct* data =  (DHStruct*)m_pBrushCb->userData(Qt::UserRole);//能正确解析出放在控件里的自定义结构体
    int j = 0;
}

总结:一定要定义结构体指针类型,setUserData,然后从userData获取的数据才是有效的!

附图,有图有真相
在这里插入图片描述组装数据

在这里插入图片描述
获取数据

最后附上不错两个博客文章
1.Qt文档阅读笔记-关于Q_DECLARE_METATYPE原理以及使用
https://it1995.blog.csdn.net/article/details/82084295

2.qt setData()和data()
https://blog.csdn.net/swartz_lubel/article/details/55195509

标签:userData,setUserData,pBrushCb,Qt,DHStruct,int,pCb,dh2
来源: https://blog.csdn.net/dhl11/article/details/117838764

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有