在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; }