Я подключил сигнал 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
// [...]
Я уже проверил соединения с двойным сигналом или различные события, связанные с этим слотом, но это не проблема. Может кто-нибудь объяснить, что здесь происходит и как это предотвратить?
Это ошибка 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);
}