QT信号与槽的使用

信号与槽的使用

信号的特点:

无返回值,可以有参数,可以重载,只需声明,无需定义实现

槽函数的特点:

无返回值,可以有参数,可以重载

QT4中

connect(sender,SIGNAL(signal),receiver,SLOT(slot));
senderreceiver分别是指向QObject的指针,signal和slot是函数名。如带参数也可,如下为带两个参数的形式:
connect(sender,SIGNAL(signal(int,QString)),receiver,SLOT(slot(int,QString)));
优点:直接支持信号与槽重载,信号与槽函数可直接带参数使用。
缺点:(1)不支持编辑期间查;(2)无法使用相容类型参数,即使通过typedef重定义类型也不行;(3)槽函数申明时必须使用slots关键字,且明确权读取权限。

QT5中

connect(sender,&Sender::signal,receiver,&Receiver::slot);
优点:(1)支持编辑期间查;(2)可使用相容类型参数;(3)槽函数可使用任意函数。
缺点:对重载信号与槽支持不太好,需转换。
假如sender有两个信号,分别为void signal()和void signal(int QString); 如直接用connect(sender,&Sender::signal,receiver,&Receiver::slot);
会不知道调用哪个信号,需用使用函数指针转换,方法如下:
void (&Sender::*p1)() = &Sender::signal;
connect(sender,p1,receiver,&Receiver::slot);
void (&Sender::*p2)(int,QString) = &Sender::signal;
connect(sender,p2,receiver,&Receiver::slot);
这样即可

/*==========MyWidget.h============*/
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include<QPushButton>
#include <QWidget>
class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = nullptr);
    void dealslot1();
    void dealslot2();
signals:
    void mysignal();
    void mysignal(int ,QString);
public slots:
    //QT4模式public slots关键字,QT5不需加
    void myslot();
    void myslot(int,QString);
private:
    QPushButton* btn1;
    QPushButton* btn2;
};
#endif // MYWIDGET_H
/*==========MyWidget.cpp============*/
#include "MyWidget.h"
#include<QApplication>
#include<QDebug>

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
    /*1.使用自定义信号与槽函数
     *2.使用信号和槽的重载
     *3.功能:点击btn1,实现字体变红
     *       点击btn2,实现背景变灰,并在qDebug栏输出参数
     *4.要点:点击btn1,处理槽函数dealslot1,dealslot1函数处理内容为:发射不带参数的mysignal();
     *       点击btn2,处理槽函数dealslot3,dealslot3函数处理内容为:发射带参数的mysignal(int,QString);
     * 由于QT5处理信号槽的方式是connect(sender,&Sender::signal,receiver,&Receiver::slot);
     * 故,在信号和槽函数均有重载的情况下,仅知道函数名,编辑器并不知道调用哪一个信号和槽,
     * 因此,定义不同的函数指针指向合适的重载函数加以区分
     */
    btn1 = new QPushButton(this);
    btn1->setText("按钮1");
    btn1->move(50,50);
    btn1->resize(150,50);
    btn2 = new QPushButton(this);
    btn2->setText("按钮2");
    btn2->move(200,50);
    btn2->resize(150,50);
    
    connect(btn1,&QPushButton::pressed,this,&MyWidget::dealslot1);
    connect(btn2,&QPushButton::pressed,this,&MyWidget::dealslot2);
    /*
     * QT4模式,已成功运行
     * connect(this,SIGNAL(mysignal()),this,SLOT(myslot()));
     * connect(this,SIGNAL(mysignal(int,QString)),this,SLOT(myslot(int,QString)));
     */
    
    /*以下在QT5环境也正常运行*/
    void (MyWidget::*mysignal1)() = &MyWidget::mysignal;
    void (MyWidget::*mysignal2)(int,QString) = &MyWidget::mysignal;
    void (MyWidget::*myslot1)() = &MyWidget::myslot;
    void (MyWidget::*myslot2)(int,QString) = &MyWidget::myslot;
    connect(this,mysignal1,this,myslot1);
    connect(this,mysignal2,this,myslot2);
}

int main(int argc,char** argv)
{
    QApplication app(argc,argv);
    MyWidget w;
    w.show();
    app.exec();
}
void MyWidget::dealslot1()
{
    emit mysignal();//发射不带参数的信号
}
void MyWidget::dealslot2()
{
    emit mysignal(100,"你好");//发射带两个参数的信号
}

void MyWidget::myslot()
{
    setStyleSheet("color: red");//字体红
}
void MyWidget::myslot(int i,QString str)
{
    setStyleSheet("background: gray");//背景变灰
    qDebug()<<i<<str.toUtf8().data();//打印参数
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值