QComboBox绑定对象指针

it2026-08-05  7

文章目录

问题处理办法-强制转换

问题

在MFC界面编程时,使用CComboBox对象,习惯于将一个固定的对象绑定到每个CComboBox Item上,当需要使用对象的数据时,取出指针即可。 在QComboBox中,绑定是通过void setItemData( int index, const QVariant &value, int role = Qt::UserRole)实现的。取数据是通过 QVariant QComboBox::itemData(int index, int role = Qt::UserRole) const实现的。 所以问题转化为 如何用 QVariant 保存指针并获取指针。

处理办法-强制转换

1.在32位系统下,经过unsigned 中间类型强制转换 示例代码:

void test_varianti0() { CMotorConfig mcfg; qDebug()<<"config addr "<<&mcfg; QVariant var(reinterpret_cast<unsigned>(&mcfg)); unsigned uiVal = var.toUInt(); CMotorConfig *pMcfg = reinterpret_cast<CMotorConfig*>(uiVal); qDebug()<<"unsigned value "<<uiVal; qDebug()<<"config addr from variant "<<pMcfg; } //测试vector void test_varianti1() { CMotorConfig mcfg; std::vector<CMotorConfig> vctMcfg; qDebug()<<"config addr "<<&mcfg; vctMcfg.push_back(mcfg); qDebug()<<"config addr from vector "<<&vctMcfg.front(); QVariant var(reinterpret_cast<unsigned>(&vctMcfg.front())); unsigned uiVal = var.toUInt(); CMotorConfig *pMcfg = reinterpret_cast<CMotorConfig*>(uiVal); qDebug()<<"unsigned value "<<uiVal; qDebug()<<"config addr from variant "<<pMcfg; //use iterator qDebug()<<"config addr from iterator "<<&(*vctMcfg.begin()); QVariant var2(reinterpret_cast<unsigned>(&(*vctMcfg.begin()))); uiVal = var2.toUInt(); pMcfg = reinterpret_cast<CMotorConfig*>(uiVal); qDebug()<<"unsigned value "<<uiVal; qDebug()<<"config addr from variant "<<pMcfg; //test assign QVariant var3 = var2; uiVal = var3.toUInt(); pMcfg = reinterpret_cast<CMotorConfig*>(uiVal); qDebug()<<"unsigned value "<<uiVal; qDebug()<<"config addr from variant "<<pMcfg; } //简化例子1 void test_varianti2() { CMotorConfig mcfg; qDebug()<<"config addr "<<&mcfg; QVariant var(reinterpret_cast<unsigned>(&mcfg)); CMotorConfig *pMcfg = reinterpret_cast<CMotorConfig*>(var.toUInt()); qDebug()<<"config addr from variant "<<pMcfg; }

缺点:不能保证unsigned int和void* 是等长的;

2.使用void* 中间类型

//使用setValue和value void test_varianti3() { CMotorConfig mcfg; qDebug()<<"config addr "<<&mcfg; QVariant var; var.setValue<void*>(&mcfg); void *pMcfg = var.value<void*>(); qDebug()<<"config addr from variant "<<pMcfg; } //使用fromValue 和 value void test_varianti4() { CMotorConfig mcfg; qDebug()<<"config addr "<<&mcfg; QVariant var = QVariant::fromValue<void*>(&mcfg); void *pMcfg = var.value<void*>(); qDebug()<<"config addr from variant "<<pMcfg; }
最新回复(0)