小言_互联网的博客

Qt自定义信号和槽

389人阅读  评论(0)

一、创建自定义信号与槽函数

新建一个项目,名称:02_SignalsAndSlot(可自定义)
背景:下课后,老师触发一个信号->饿了,学生响应信号->请客吃饭
增加两个类:Teacher、Student(新建C++ Class类)

1、创建Teacher类,继承自QObject,定义信号(signals)为饿了Hungry


  
  1. #ifndef TEACHER_H
  2. #define TEACHER_H
  3. #include <QObject>
  4. #include <QDebug>
  5. class Teacher : public QObject
  6. {
  7. Q_OBJECT
  8. public:
  9. explicit Teacher(QObject *parent = nullptr);
  10. signals:
  11. void Hungry(); //信号不需要实现
  12. public slots:
  13. };
  14. #endif // TEACHER_H

  
  1. //.cpp文件不需要做任何修改
  2. #include "teacher.h"
  3. Teacher::Teacher(QObject *parent) : QObject(parent)
  4. {
  5. }

2、同样步骤创建Student类继承自QObject,定义slots槽函数为请客Treat()


  
  1. #ifndef STUDENT_H
  2. #define STUDENT_H
  3. #include <QObject>
  4. class Student : public QObject
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit Student(QObject *parent = nullptr);
  9. signals:
  10. public slots:
  11. void Treat();
  12. };
  13. #endif // STUDENT_H

在.cpp中实现槽函数


  
  1. #include "student.h"
  2. #include <QDebug>
  3. Student::Student(QObject *parent) : QObject(parent)
  4. {
  5. }
  6. void Student::Treat()
  7. {
  8. qDebug( "请老师吃饭");
  9. }

二、使用信号与槽

1、MainWindow.h头文件中导入#include "teacher.h",#include "student.h",并声明指针变量和和一个出发函数classisover()

  
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include "teacher.h"
  4. #include "student.h"
  5. #include <QMainWindow>
  6. namespace Ui {
  7. class MainWindow;
  8. }
  9. class MainWindow : public QMainWindow
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit MainWindow(QWidget *parent = nullptr);
  14. ~MainWindow();
  15. private:
  16. Ui::MainWindow *ui;
  17. Teacher * tc;
  18. Student * st;
  19. void classIsOver();
  20. };
  21. #endif // MAINWINDOW_H

2、MainWindow.cpp中使用emit关键字触发信号,connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));connect方法就是把发送者、信号、接受者和槽存储起来,供后续执行信号时查找


  
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. MainWindow::MainWindow(QWidget *parent) :
  4. QMainWindow(parent),
  5. ui( new Ui::MainWindow)
  6. {
  7. ui->setupUi( this);
  8. //创建一个老师对象
  9. this->tc = new Teacher( this);
  10. //创建一个学生对象
  11. this->st = new Student( this);
  12. //老师饿了 学生请客连接==
  13. connect(tc, &Teacher::Hungry, st, &Student::Treat);
  14. //调用下课函数
  15. classIsOver();
  16. }
  17. MainWindow::~MainWindow()
  18. {
  19. delete ui;
  20. }
  21. void MainWindow::classIsOver()
  22. {
  23. emit tc->Hungry(); //成功触发 使用emit关键字
  24. }

三、运行

 

 

 


转载:https://blog.csdn.net/fsdad/article/details/117256098
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场