Использование Qt :: UserRole и Qt :: DisplayRole для элементов в QComboBox - PullRequest
2 голосов
/ 27 марта 2019

Я новичок в 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 ]

2 голосов
/ 27 марта 2019

Нет необходимости устанавливать модель, поскольку 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++;
    }
}

И чтобы получить макинтош, вы должны использовать метод currentData() в слоте:

// Slot:

auto mac = memData->comboBox->currentData(Qt::UserRole + 1);
1 голос
/ 27 марта 2019

Вы можете использовать сигнал 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);

}
...