Qt编码bug——槽函数调用两次现象解答

场景再现,当符合条件(相机没有打开)时,弹出错误提示框,点击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<QtGui *>(_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尝试使用以下规则查找一个:

  1. 如果只有一个按钮,则在按下Esc时激活该按钮。
  2. 如果有取消按钮,则当按下Esc键时该按钮被激活。
  3. 如果恰好有一个按钮相当于cancel或no,则是按下Esc时激活的按钮。
©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值