场景再现,当符合条件(相机没有打开)时,弹出错误提示框,点击ok,提示框关闭返回主窗口。
问题来了:错误提示框又自动弹出来了一遍
问题代码:
void QtGui::on_Btn_clicked() {
if (!capture.isOpened()) // if not success, exit program
{
QMessageBox::critical(this, tr("ERROR"),
tr("Unable to open camera"));//程序无法打开相机
return;//为什么点击后出现两次框呢?
}
while (1)
{
Mat frame;
capture >> frame;
emit ShowImage(frame,imgLabel,grid);
}
}
debug跟踪一下,return转到moc_QtGui.cpp case 1,又调用了一次。。
这是因为相同的槽函数被定义了两次,如果在ui(Qt Designer)中用图形化的方式进行了槽函数的连接,在代码处就不需要再写connect函数了,反之,同理。
void QtGui::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
if (_c == QMetaObject::InvokeMetaMethod) {
QtGui *_t = static_cast(_o);
Q_UNUSED(_t)
switch (_id) {
case 0: _t->on_showImgBtn_clicked(); break;
case 1: _t->on_Btn_clicked(); break;
case 2: _t->calibration(); break;
default: ;
}
}
Q_UNUSED(_a);
}
这和槽函数的调用有关,qt_static_metacall函数包含了槽的索引,用来调用槽函数,on_Btn_clicked()函数正是由它调用的,返回也自然到这里来了。
参考原理解析:
https://blog.51cto.com/9291927/2070398
https://blog.csdn.net/newthinker_wei/article/details/22785763
https://jaredtao.gitee.io/2019/07/06/Qt%E5%AE%9E%E7%94%A8%E6%8A%80%E8%83%BD3-%E7%90%86%E8%A7%A3%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF/#QEventLoop%E6%A8%A1%E6%8B%9F%E5%90%8C%E6%AD%A5%E8%B0%83%E7%94%A8
https://zhuanlan.zhihu.com/p/80539605
另外,查看一下消息框的声明,static函数,返回值standardbutton,是QMessageBox的枚举,描述了标准按钮的标志。每个按钮都有一个定义。https://doc.qt.io/qt-5/qmessagebox.html#StandardButton-enum
static StandardButton critical(QWidget *parent, const QString &title,
const QString &text, StandardButtons buttons = Ok,
StandardButton defaultButton = NoButton);
返回被单击的标准按钮的标识。如果改为按Esc键,则返回转义按钮。
使用setEscapeButton()指定退出按钮(按下Esc时激活的按钮)。如果未指定转义按钮,则QMessageBox尝试使用以下规则查找一个:
- 如果只有一个按钮,则在按下Esc时激活该按钮。
- 如果有取消按钮,则当按下Esc键时该按钮被激活。
- 如果恰好有一个按钮相当于cancel或no,则是按下Esc时激活的按钮。