Qt信号槽的四种写法

19 篇文章 1 订阅

概述

这四种写法在最新版本的Qt中都可用,有比较简单的写法,也有比较复杂的写法,为了理解其中的差异,不妨先定义个控件:

 

class Button : public QWidget {

Q_OBJECT

public:

explicit MyButton(QWidget *parent = nullptr);

 

signals:

void sigClicked();

void sigClicked(bool check);

};

 

class Widget : public QWidget {

Q_OBJECT

public:

Button * pBtn;

 

protected slots:

void onClicked();

void onClicked(bool check);

}

 

1、老版本的写法

老版本的写法比较复杂些,需要将信号和槽进行明确的指定,包括形参,但不会有重载信号和槽函数的问题,用MyButton时连接这两个信号,应该这么写:

connect(pBtn, SIGNAL(sigClicked()), this, SLOT(onClicked())); connect(pBtn, SIGNAL(sigClicked(bool)), this, SLOT(onClicked(bool)));

这种写法比较麻烦,常常在用的时候缺少括号,不过该写法很明确,一眼就能看出来是将哪个信号连接到哪个槽。

 

2、Qt5.0以后推出了一种新的写法

connect(pBtn, &Button::sigClicked, this, &Widget::onClicked);

这种写法看起来比较简单,但是有隐患,比如这里就会报错,

error: no matching member function for call to 'connect' connect(pBtn,&Button::sigClicked,this,&Widget::onClicked); ^~~~~~~

这是因为我们自定义的 Button 中存在两个重载信号,然后用这种 connect 的方式会无法识别到底想要连接哪个信号。所以,如果信号是重载的话,需要用下面的写法来替换:

connect(pBtn, static_cast<void (Button::*)(bool)>(&Button::sigClicked), this, &Widget::onClicked);

问题又来了,如果我的onClicked槽也是重载的话,还是会报同样的错误。因为编译器不知道你想要真正连接哪个槽。所以这里建议,如果信号重载,可以用上面的方法来写,如果槽重载…还是用第一种方法来 connect 吧,比较保险,虽然比较麻烦点。

 

3、最新的写法

这种写法主要针对重载信号的连接做了调整,会更简单些:

同样是上面的示例:

 

connect(pBtn, QOverload<bool>::of(&Button::sigClicked),this,&Widget::onClicked);

很显然这种写法相对于第二种会比较简单些,但依然不能连接到重载的槽函数,如果连接重载槽函数,还是会报之前的错误。

 

4、Lambda 函数写法

个人比较喜欢用lambda函数的方式,如果槽函数中的内容比较简单的话,没必要再去单独定义一个槽来连接, 直接用Lambda 函数会更简单。

来看一下示例:

 

connect(pBtn, QOverload<bool>::of(&Button::sigClicked),

[=](bool check){

/* do something.. */

});

 

connect(pBtn, static_cast<void (Button::*)(bool)>(&Button::sigClicked), this, [=](bool check){ //do something });

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值