#cpp #qt
В общем, хочу сделать так, чтоб при открытии комбобокса происходило его же обновление
- обновление списка COM-портов в системе.
void MainWindow::updateCOMlist()
{
ui->comboBoxCOMport->clear();
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
ui->comboBoxCOMport->addItem(info.portName());
}
}
Делаю это по сигналу:
connect(ui->comboBoxCOMport,
SIGNAL(currentIndexChanged(int)),
this,
SLOT(updateCOMlist()));
и как я понял происходит такое действие: вначале происходит очищение, потом добавляется
первый элемент, что вызывает слот и происходит снова удаление и так далее.
Как можно исправить данную проблему ?
Ответы
Ответ 1
Я бы поразбирался с архитектурой, возможно можно сделать по другому, но для вашего примера попробуйте: void MainWindow::updateCOMlist() { ui->comboBoxCOMport->blockSignals(true); ui->comboBoxCOMport->clear(); foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { ui->comboBoxCOMport->addItem(info.portName()); } ui->comboBoxCOMport->blockSignals(false); }Ответ 2
При добавлении новых элементов используйте блокировку сигналов. Combobox->blockSignals(true) //add actions Combobox->blockSignals(false) Тогда сигналы от виджета не будут поступать и не будет зацикливания.Ответ 3
Другим вариантом решение может быть переопределение метода void QComboBox::showPopup() #includeclass CPortsComboBox : public QComboBox { Q_OBJECT public: explicit CPortsComboBox(QWidget *parent = 0); virtual ~CPortsComboBox(); public: virtual void showPopup() { while (count() > 0) { removeItem(0); } addItem("hello"); addItem("World"): QComboBox::showPopup(); } }; Более трудоёмким решение будет переопределение eventfilter-ов. В этой теме это обсуждалось.
Комментариев нет:
Отправить комментарий