我已将QLineEdit的editingFinished信号连接到我的应用程序中的一个插槽,如果输入在某种程度上意外,则显示QMessageBox。奇怪的是,消息框显示两次,因此我在执行它的位置放置了一个断点,并查看了堆栈跟踪。有QMessageBox.exec()调用QApplication :: processEvents(),它似乎以某种方式转发并再次处理同一事件。
我的堆栈跟踪第一次看起来像这样:
MyApp::mySlot()
QLineEdit::editingFinished()
QGuiApplicationPrivate::processMouseEvent()
QEventLoop::processEvents()
QApplication::exec()
和第二次这样:
MyApp::mySlot()
QLineEdit::editingFinished()
QGuiApplicationPrivate::processWindowSystemEvent()
QEventLoop::processEvents()
QDialog::exec()
// stack trace of run #1 here
// [...]
我已经检查了双信号连接或连接到此插槽的不同事件,但这似乎不是问题。有人可以解释这里发生了什么以及如何预防吗?
答案 0 :(得分:4)
这是一个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);
}