Использование Qt ::UserRole и Qt ::DisplayRole для элементов в QComboBox

#c #qt #qt5 #qcombobox

#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);
  

Комментарии:

1. Вы могли бы объяснить, в чем ваша проблема. Вы не знаете, как получить MAC? удалить memData->comboBox->setModel(model); и QStandardItemModel *model = new QStandardItemModel(this);

2. Проблема в том, что имя устройства отправляется, когда я выбираю устройство, а не mac-адрес

3. Другими словами, вы хотите получить информацию getMacAddress в слоте, который подключен к QComboBox?

4. Да, и было бы неплохо, если бы я мог сделать это без изменения какого-либо другого кода.

5.Вы можете получить это с помощью currentData memData->comboBox->currentData(Qt::UserRole 1);

Ответ №1:

Нет необходимости устанавливать модель, поскольку 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. Спасибо, чувак, поэтому я попробовал это в слоте. Мне пришлось определить регистр для моего кода и выполнить добавление параметров и прочего, и это сработало.

Ответ №2:

Можно использовать currentIndexChanged сигнал

Одним из вариантов является использование labmda.

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

    });
  

Или добавьте слот в свой класс

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

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

}