qt同一个信号和槽多次连接,则槽函数会触发多次(默认),可能不是我们想要的结果。

有3种方法可以解决这个问题:

1. 仅在初始化函数中进行连接

因为初始化函数在在整个程序中只运行一次,所以这里面连接信号和槽,就能避免重复连接问题了。

2. 连接函数写上参数Qt::UniqueConnection

Qt::UniqueConnection的作用是:如果该信号以前没连接过,则连接它,返回true,如果以前连接过,则不再连接,返回false。例如 connect(ui.btn, &QAbstractButton::clicked, this, &QtWidgetsApplication2::btnClicked, Qt::UniqueConnection);
 

3. 槽函数触发后,在槽函数中断开(该方式可以实现动态的连接了)

 QMetaObject::Connection connectHandler = connect(pBtn, &QAbstractButton::clicked, this, &QtWidgetsApplication2::btnClicked);
 
// 先断开连接
disconnect(connectHandler); 
 
// 重新连接
connect(pBtn, &QAbstractButton::clicked, this, &QtWidgetsApplication2::btnClicked);

参考博客:Qt槽函数会被执行多次的问题原因及解决方法_C 语言_脚本之家

信号与槽该连接的时机,就看发信号的对象是否创建出来,接收对象是否创建出来。如果一个发信号的对象删除了,那么该信号和槽也就无效了的。

 

04-09 05:06