04--Qt信号与信号槽

直接上图

  • 优点:松散耦合,信号发出端和接收端可以毫无关联,如果要关联,就用connect函数

connect函数使用

常用的一般模式 connect(sender,signal,receiver,slot); 参数: 1、信号发出者 2、信号 3、信号接受者 4、接收到信号执行的任务
  • 1679368073109 大部分的类都有槽函数和信号
  • 信号:clicked(bool checked = false)
  • 槽函数:close()

举例:点击窗口按钮关闭窗口

Widget::Widget(QWidget *parent) : QWidget(parent) { //创建按钮 QPushButton *button =new QPushButton("点击关闭窗口",this); this->resize(600,400); //信号和槽函数 connect(button,&QPushButton::clicked,this,&Widget::close); } Widget::~Widget() { }

自定义信号槽机制

举个例子步骤1:

老师饿了,学生请客

步骤2:定义老师类和学生类(创建类的时候首字母必须大写)

步骤3:在老师类中声明信号,并且在学生类中声明并实现槽函数

步骤4:创建对象

  • 首先找到techer.h,声明一个信号(不需要实现,信号返回值void,参数可以存在,仅声明不需要实现,可以重载)

    //techer.h中 signals: void hungury();
  • student.h(槽函数,一般在public slots里面写,对于一些高版本的qt来说,也可以写到public或者全局;返回值是void,参数可以存在,需要声明并实现,可以重载)

    //student.h public slots: void treat();
    //student.cpp 添加 void Student::thread(){ }

步骤5:触发信号(下课)

widget.cpp(声明触发信号的成员函数)

connect(tea,&Techer::hungury,stu,&Student::treat); void ClassOver();

widget.cpp(定义触发信号的成员函数+调用该成员函数)

ClassOver(); } void Widget::ClassOver(){ //发送信号 emit tea->hungury(); }

接下来是整个流程代码:

//创建的student和techer类,使用了QObject格式创建,在techer.cpp中没有改动任何东西,techer.h中增加以下代码 #ifndef TECHER_H #define TECHER_H #include <QObject> class Techer : public QObject { Q_OBJECT public: explicit Techer(QObject *parent = nullptr); signals: void hungury();//这个代码是作为信号存在 public slots: }; #endif // TECHER_H
//接下来是student.cpp #ifndef STUDENT_H #define STUDENT_H #include <QObject> class Student : public QObject { Q_OBJECT public: explicit Student(QObject *parent = nullptr); signals: public slots: void treat();//这作为槽函数存在 }; #endif // STUDENT_H
//接下来是student.cpp #include "student.h" #include<QDebug> Student::Student(QObject *parent) : QObject(parent) { } //接下来的代码来正面其槽函数正确响应 void Student::treat(){ qDebug()<<"请吃饭"; }
//widget.h #ifndef WIDGET_H #define WIDGET_H #include "techer.h" #include <QWidget> #include "student.h" class Widget : public QWidget { Q_OBJECT //这段代码定义了一个名为Widget的类,其中包含了两个公有成员变量(对象)Teahcer *tea和Student *stu,它们都是指向Teahcer和Student类对象的指针。这意味着Widget类的对象可以通过这些指针来访问Teahcer和Student类的成员函数和成员变量。 public: Widget(QWidget *parent = 0); ~Widget(); void ClassOver(); Techer *tea; Student *stu; }; #endif // WIDGET_H
//widget.cpp #include "widget.h" #include <QPushButton> Widget::Widget(QWidget *parent) : QWidget(parent) { //创建按钮 QPushButton *button =new QPushButton("点击关闭窗口",this); this->resize(600,400); //信号和槽函数 connect(button,&QPushButton::clicked,this,&Widget::close); this->tea = new Techer(); this->stu = new Student(); //设置正确的信号和槽机制 connect(tea,&Techer::hungury,stu,&Student::treat); //调用,下课触发老师饿了的信号 ClassOver(); } void Widget::ClassOver(){ //发送信号,emit是一个关键字用于Qt的信号槽系统发送信号,在这段代码中,emit用于向连接到tea对象的hungury()信号的槽发送一个信号。这个信号的发送将会触发连接到该槽的槽函数(slot function)的执行。当tea对象发出hungury()信号时,与该信号相关联的槽函数将会被调用。 emit tea->hungury(); } Widget::~Widget() { }

__EOF__

本文作者Lachlan_Yang
本文链接https://www.cnblogs.com/LaChlanYang/p/17240267.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Lachlan_Yang  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示