Как предотвратить вызов двойного слота при отображении QMessageBox?

Я подключил сигнал editFinished QLineEdit к слоту в моем приложении, показывая QMessageBox, если ввод в некотором роде является неожиданным. Как ни странно, окно сообщения отображается дважды, поэтому я поставил точку останова, где оно выполняется, и посмотрел на трассировку стека. Там QMessageBox.exec () вызывает QApplication :: processEvents (), который, кажется, каким-то образом пересылает и обрабатывает то же событие снова.

Трассировка моего стека в первый раз выглядит так:

MyApp::mySlot()
QLineEdit::editingFinished()
QGuiApplicationPrivate::processMouseEvent()
QEventLoop::processEvents()
QApplication::exec()

и 2-й раз так:

MyApp::mySlot()
QLineEdit::editingFinished()
QGuiApplicationPrivate::processWindowSystemEvent()
QEventLoop::processEvents()
QDialog::exec()
// stack trace of run #1 here
// [...]

Я уже проверил соединения с двойным сигналом или различные события, связанные с этим слотом, но это не проблема. Может кто-нибудь объяснить, что здесь происходит и как это предотвратить?

1

Решение

Это ошибка Qt, что editFinished запускается дважды, вы можете прочитать об этом здесь:

https://forum.qt.io/topic/39141/qlineedit-editingfinished-signal-is-emitted-twice

Существует также обходной путь для этого.

if(lineEdit->text().toDouble()<1000) {
lineEdit->blockSignals(true);
QMessageBox::information(this, "Information", "Incorrect value");
lineEdit->blockSignals(false);
}
4

Другие решения


По вопросам рекламы [email protected]