亲宝软件园·资讯

展开

Qt槽函数会被执行多次的问题原因及解决方法

荆楚闲人 人气:0

今天在项目中发现发送一次信号,槽函数被执行多次,如下:

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连接的槽函数相同,所以执行了两次)

加载全部内容

相关教程
猜你喜欢
用户评论