Я подключил editFinished сигнал QLineEdit к слоту в моем приложении, показывающему QMessageBox, если вход каким-то образом является неожиданным. Как ни странно, окно сообщения отображается дважды, поэтому я ставлю точку останова, где он выполняется, и посмотрел на трассировку стека. Там QMessageBox.exec() вызывает QApplication :: processEvents(), который каким-то образом перенаправляет и обрабатывает одно и то же событие снова.Как предотвратить вызов двойного слота при показе QMessageBox?
Моей трассировка стеки в первый раз выглядит н так:
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
// [...]
Я уже проверил для двойных сигнальных соединений или различных мероприятий, связанных к этому слоту, но это, похоже, не проблема. Может ли кто-нибудь объяснить, что здесь происходит и как его предотвратить?
Да, спасибо. Если я использую returnPressed(), он выполняется только один раз. К сожалению, работа с блокирующими и разблокирующими сигналами до и после показа MBox не работает, хотя кажется, что это все для других. – user1709708
Если обходной путь не работает для вас, можете ли вы обработать focusOutEvent и returnPressed? Вместе они должны быть похожими на editFinished. – demonplus
Я, наконец, нашел проблему. Несколько модулей QLineEdits были подключены к одному слоту updateAll. Затем, когда я украл фокус с одного QLineEdit, обычно нажав TAB, курсор переместится на другой QLineEdit, подключенный к тому же слоту. Это означает, что вход для проверки слота был запущен для выбранного QLineEdit, потенциально показывающий QMessageBox, который снова украл фокус со второго QLineEdit, который в настоящее время сосредоточен и, таким образом, приводит к выполнению второго слота. Интересно, что теперь он даже работает без каких-либо обходов. – user1709708