#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-ов. В этой теме это обсуждалось.
Комментариев нет:
Отправить комментарий