今天在项目中发现发送一次信号,槽函数被执行多次,如下:
connect(pBtn, &QAbstractButton::clicked, this, &QtWidgetsApplication2::btnClicked);
pBtn为按钮。上述代码在一个循环中被连接信号槽多次 ,单击一次pBtn按钮,槽函数QtWidgetsApplication2::btnClicked被响应了多次。我原以为connect会将上次连接的信号槽覆盖掉,看来这货是每次累加啊,即connect几次就发送几次。解决方法有两种:
1.在最后一个参数加入Qt::UniqueConnection,如下:
connect(ui.btn, &QAbstractButton::clicked, this, &QtWidgetsApplication2::btnClicked, Qt::UniqueConnection);
Qt::UniqueConnection的作用是:如果该信号以前没连接过,则连接它,返回true,如果以前连接过,则不再连接,返回false。
2.用disconnect函数先断开连接,再重新connect
如下:
QMetaObject::Connection connectHandler = connect(pBtn, &QAbstractButton::clicked, this, &QtWidgetsApplication2::btnClicked);
// 先断开连接
disconnect(connectHandler);
// 重新连接
connect(pBtn, &QAbstractButton::clicked, this, &QtWidgetsApplication2::btnClicked);
另外如下也会执行多次:
connect(ui.pushButtonSwitch, SIGNAL(clicked(bool)), this, SLOT(on_pushButtonSwitch_clicked(bool)));
其中on_pushButtonSwitch_clicked(bool)函数的命名是on_对象名_signal名的规则,而这正是Qt的信号-槽默认的连接规则,也就是说你不对按钮进行任何connect时,而仅仅只是把槽函数写成on_对象名_signal形式,qt也会自动执行该函数,一旦你connect了按钮的clicked信号但响应clicked信号的槽函数命名不是on_对象名_signal名的规则,那么qt就不会自动执行on_对象名_signal名的规则函数,转而执行你定义的槽函数。上面代码connect信号到qt默认的信号-槽默认连接规则的槽函数上,且槽函数命名是on_对象名_signal名的规则,所以qt会执行两次,一次是connect连接的,一次是qt默认的(默认的槽函数和你conenct连接的槽函数相同,所以执行了两次)
到此这篇关于Qt槽函数会被执行多次的问题原因及解决方法的文章就介绍到这了,更多相关Qt槽函数执行内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!