Qt信号槽的几种写法

信号槽是Qt的核心部分,它使得对象之间的的通信变得很简单。Qt通过connect来连接信号与槽,当信号被发出时,槽函数立刻被执行,connect函数有五个重载:

// 重载1
QMetaObject::Connection connect(const QObject *, const char *, const QObject *, const char , Qt::ConnectionType); 
// 重载2
QMetaObject::Connection connect(const QObject *, const QMetaMethod &, const QObject *, const QMetaMethod &,Qt::ConnectionType);
// 重载3
QMetaObject::Connection connect(const QObject *, const char *,const char *,Qt::ConnectionType) const; 
// 重载4
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,const QObject *, PointerToMemberFunction,Qt::ConnectionType)
// 重载5
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,Functor);

我们可以看到重载一将signal和slot作为字符串处理,简单的写法为:

QObject::connect(&button, SIGNAL(clicked()),&app, SLOT(quit()));

这里SIGNAL和SLOT宏将两个函数名转化为了字符串处理
第二种写法为:

connect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::close);

这时我们使用信号槽的函数地址作为参数,相比于第一种简单的做法,这样做的好处是可以在编译期获得类型检查
第三种写法是当第三个参数为其本身(this指针)时,可以将其省略。
第四种写法即参数变为了指向成员函数的指针,当成员函数没有重载时,我们可以直接使用:

connect(this,&MainWindow::send,this,&MainWindow::close);

其中send为无参成员函数,当我们加入一个重载void send(const QString &str);时,上述代码就会报错,因为编译器无法确定使用哪一个函数,此时需要我们显示指定调用的成员函数,有两种写法,其原理是一样,只不过一种函数指针有名字,一种为匿名函数指针:

void (MainWindow:: *newFunName) (const QString &) = &MainWindow::send;
connect(this,newFunName,&re,&Receiver::receiver);

匿名函数指针采用显示类型转换,这样当我们的函数参数改变时,不会因为编译器的隐式转换导致问题:

connect(this,static_cast<void (MainWindow:: *)(const QString &)>(&MainWindow::send),&re,&Receiver::receiver);

最后一种写法槽函数为Functor 类型。这个类型可以接受 static 函数、全局函数以及 Lambda 表达式.

connect(this,static_cast<void (MainWindow:: *)(const QString &)>(&MainWindow::send),[]{
        qDebug() << "lambda";
    });
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WJsuperrunner

你的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值