Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Обновление QCombobox приводит к рекурсии?

#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() #include class 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-ов. В этой теме это обсуждалось.

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

Отправить комментарий