对QComboBox中的项目使用Qt :: UserRole和Qt :: DisplayRole

时间:2019-03-27 06:29:55

标签: c++ qt qt5 qcombobox

我是C ++ Qt的新手。我正在尝试使用与需要使用的值不同的值填充QComboBox。 例如,QComboBox显示设备的名称,但在选择时发送该设备的mac地址。我有数据。

我尝试使用Qt :: UserRole和Qt :: DisplayRole,但仅使用DisplayRole中提到的值。我认为我需要定义角色?如果是,那怎么办?有什么帮助吗?

QStandardItemModel *model = new QStandardItemModel(this);
int i = 0;
for (auto info : list)
{
    if (info.validateMACAddress())
    {
        memData->comboBox->addItem(info.getMacAddress().arg(i));
        memData->comboBox->setItemData(i, info.getDeviceName(), Qt::DisplayRole);
        memData->comboBox->setItemData(i, info.getMacAddress(), Qt::UserRole + 1);
        i++;
    }
}
memData->comboBox->setModel(model);

2 个答案:

答案 0 :(得分:2)

由于QComboBox具有内部模型,因此无需建立模型。另外,memData->comboBox->setItemData (i, text, Qt::DisplayRole);memData->comboBox->addItem(text);等效,因此只需放置其中一个即可。

int i = 0;
for (auto info : list){
    if (info.validateMACAddress()){
        memData->comboBox->addItem(info.getMacAddress().arg(i));
        memData->comboBox->setItemData(i, info.getMacAddress(), Qt::UserRole + 1);
        i++;
    }
}

要获取Mac,您应该在插槽中使用currentData()方法:

// Slot:

auto mac = memData->comboBox->currentData(Qt::UserRole + 1);

答案 1 :(得分:1)

您可以使用currentIndexChanged信号

一种选择是使用labmda。

connect(memData->comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
    [=](int index)
    { 
         // get mac address
         auto oMacAddress = memData->comboBox->itemData(index, Qt::UserRole +1);

    });

或在您的班级中添加空位

 connect(memData->comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
        this, &MyClass::HandleIndexChanged);

void MyClass::HandleIndexChanged(int index)
{
  // get mac address
  auto oMacAddress = memData->comboBox->itemData(index, Qt::UserRole +1);

}