2015-04-22 5 views
1

Я подключил 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 
// [...] 

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

ответ

4

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

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); 
} 
+0

Да, спасибо. Если я использую returnPressed(), он выполняется только один раз. К сожалению, работа с блокирующими и разблокирующими сигналами до и после показа MBox не работает, хотя кажется, что это все для других. – user1709708

+0

Если обходной путь не работает для вас, можете ли вы обработать focusOutEvent и returnPressed? Вместе они должны быть похожими на editFinished. – demonplus

+1

Я, наконец, нашел проблему. Несколько модулей QLineEdits были подключены к одному слоту updateAll. Затем, когда я украл фокус с одного QLineEdit, обычно нажав TAB, курсор переместится на другой QLineEdit, подключенный к тому же слоту. Это означает, что вход для проверки слота был запущен для выбранного QLineEdit, потенциально показывающий QMessageBox, который снова украл фокус со второго QLineEdit, который в настоящее время сосредоточен и, таким образом, приводит к выполнению второго слота. Интересно, что теперь он даже работает без каких-либо обходов. – user1709708