Qt学习笔记-自定义信号与槽函数

信号与槽

QPushbutton *b1=new QPushbutton(this)
QPushbutton *b2=new QPushbutton(this) 1

connect(b1,&QPushbutton::pressed,b2,&QPushbutton::close);
其作用即是按b1按钮时,对b2按钮实现close函数(也就是槽函数)b2关闭

语法 :
b1:信号发出者,指针类型
&QPushButton::pressed:处理的信号(signal), [&发送者类名::信号名字]
b2:信号接受者,指针类型
&QPushbutton::close:槽函数,信号处理函数 [&接受的类名::槽函数名字]

2

自定义槽函数

任意的成员函数,普通全局函数,静态函数
槽函数需要和信号一直(参数,返回值)
由于信号都是没有返回值的,所以槽函数一定没有返回值

connect(&b3,&QPushButton::released,this,&MainWidget::changeWin);

changeWin就是自定义槽函数

void MainWidget::changeWin()
{
this->hide();
w.show();
qDebug()<<“Yes,I Can Hear U!”;
}

自定义信号

信号必须由signals关键字申明
信号没有返回值但可以有参数
信号就是函数的声明,只需声明无需定义
使用 emit mySignal();发射信号

在常用控件QPushButtion里继承了QAbstractButton的信号
定义为按下按钮时发射信号(必须有发射的动作
在这里插入图片描述
在这里插入图片描述

实例

在MainWidget类(QWidget派生而来)中定义一个副窗口(另一个从QWidget派生出的类作为成员变量),主窗口调用副窗口轻而易举,只需定义一个槽函数实现即可。而副窗口对主窗口通讯,则需要副窗口自己发射信号让主窗口引起“中断”

subWidget 副窗口类

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include<QPushButton>
class subWidget : public QWidget
{
    Q_OBJECT
public:
    explicit subWidget(QWidget *parent = nullptr);

    void sendSlot();
signals: 
	MySignal();
private:
    QPushButton b;
};

则在构造函数里设定好信号发射的条件:当空间b被按下时调用sendSlot()发射信号
这样在主窗口隐藏时,副窗口就可以通过发射信号给主窗口

#include "subwidget.h"

subWidget::subWidget(QWidget *parent) : QWidget(parent)
{
    this->setWindowTitle("sub");
    b.setParent(this);
    b.setText("切换到主窗口");
    connect(&b,&QPushButton::clicked,this,&subWidget::sendSlot);
    resize(400,300);
}
void subWidget::sendSlot()
{
    emit mySignal();//发送广播信号主窗口也能收到
    emit mySignal(2333,"Can U Hear Me?");
}

#endif // SUBWIDGET_H

Lambda表达式

   //Lambda表达式:匿名函数对象
    //c++11增加到新特性,项目文件:CONFIG+=C++11
    //Qt配合信号一起使用方便至极
   //不必再定义多余的槽函数
    connect(b4,&QPushButton::clicked,//clicked是有参信号按下参数为false默认也是false
            //[]函数传参  //=把外部所有局部变量以及类中所有成员以值传递方式全传进来(默认为只读形式)想改值需要在()后加上mutable,比较安全
                        //this:类中的所有成员以值传递方式
                        //&:把外部所有局部变量,引用方式千万不要在引用时对函数操作动态分配内存的指针,因为指针还没有被释放引用它就导致冲突
            //()传递信号参数
            //{}函数体
            [=](bool isCheck)mutable
               {                   
               		qDebug()<<"奇怪的知识增加了!";
                    qDebug()<<isCheck;
               }
            );

在这里插入图片描述

补充

重载信号

Qt5中connect区分重载信号的方法是用指针指向各个重载信号,在连接时重载的信号用之前定义的指针表示

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include<QPushButton>
class subWidget : public QWidget
{
    Q_OBJECT
public:
    explicit subWidget(QWidget *parent = nullptr);

    void sendSlot();
signals:
    void mySignal();
    void mySignal(int , QString);//带参数的信号
private:
    QPushButton b;
};

#endif // SUBWIDGET_H

/*信号有重载,产生二义性解决方法:利用函数指针确定要调用哪个信号函数/槽函数
     *所以就不能表示为:connect(&w,&subWidget::mySignal,this,&MainWidget::deal);
     *信号函数指针定义方法: void (定义域::*指针名)(重载函数参数表)=&定义域::信号名
    */
    void (subWidget::*FistSignal)()=&subWidget::mySignal;
    void (subWidget::*SecondSignal)(int,QString)=&subWidget::mySignal;//如此就定义好两个重载信号的指针
    connect(&w,FistSignal,this,&MainWidget::dealsub);//用的是第一的无参的
    connect(&w,SecondSignal,this,&MainWidget::deal);//用的是第二个有参的

Qt4中connect区分重载信号是在直接用SIGNAL()会显示信号类型选择,关键字SLOT()显示定义的槽函数选择。connect(&b1,SIGNAL(MySignal()),&b2,SLOT(MySlot());
但是Qt4中SIGNAL后括号只要是字符串编译的时候就不会报错,运行时才会出错。故不太容易后期维护。


  1. 指定父对象 ↩︎

  2. 均为Qt5版本下 ↩︎

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
QT中的信号机制是QT框架核心的一个特性。它提供了一种在对象之间进行通信的简洁、高效的方式。自定义信号是在QT中扩展信号机制的一种方式,可以灵活地将自定义信号连接到相应的函数上。 在QT中,自定义信号的示例可以如下所示: ```cpp #include <QObject> #include <QPushButton> class MyButton : public QPushButton { Q_OBJECT public: MyButton(QWidget *parent = nullptr) : QPushButton(parent) {} signals: void clickedWithMessage(const QString& message); // 自定义信号 public slots: void onClicked() // 函数 { emit clickedWithMessage("Button is clicked!"); // 发射自定义信号,并传递消息 } }; class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) { MyButton *button = new MyButton(this); connect(button, &MyButton::clickedWithMessage, this, &MyWidget::onButtonClicked); // 连接自定义信号函数 } public slots: void onButtonClicked(const QString& message) // 函数 { qDebug() << "Received message:" << message; } }; ``` 在这个示例中,我们自定义了一个派生自QPushButton的类MyButton,并在其中声明了一个自定义信号`clickedWithMessage`。当按钮被点击时,会发射该自定义信号,并传递一个消息。 然后,在MyWidget的构造函数中,我们创建了一个MyButton实例,通过`connect`函数将该按钮的自定义信号与MyWidget的函数`onButtonClicked`进行连接。 当按钮被点击时,MyWidget的函数`onButtonClicked`会被调用,接收到传递的消息并打印出来。 通过自定义信号,我们可以自由地在不同的对象之间实现消息的传递与处理,使得代码更加模块化和可维护。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值