今天在项目中发现发送一次信号,槽函数被执行多次,如下:
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连接的槽函数相同,所以执行了两次)