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