QT系统学习篇(5)-信号与槽

打印 上一主题 下一主题

主题 1776|帖子 1776|积分 5338

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、信号槽的优点

信号槽的优点,疏松耦合,信号发送端和吸收端自己没有关联,通过connect连接将两头耦合在一起。
  1.    myPushButton *btn3=new myPushButton(this);
  2.    btn3->setText("我的按钮");
  3.    btn3->move(200,0);
  4.    //发送者 信号 ,接收者,处理的槽函数
  5.    connect(btn3,&QPushButton::clicked,this,&Widget::close);
复制代码
2、自界说的信号和槽

自界说信号:
  1. signals:
  2.     //自定义信号,写到signals下
  3.     //返回值void,需要声明,不用实现
  4.     //可以有参数,可以重载
  5.     void hungry();
复制代码
自界说槽函数:
  1. public slots:
  2.     //早期Qt版本,必须写到public slots下,高级版本可以写到public或者全局下
  3.     //返回值void,需要声明,需要实现
  4.     //可以有参数,可以重载
  5.     void treat();
复制代码
案例

下课,老师饿了触发信号,门生响应,请用饭
widget.h
  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. #include "teacher.h"
  5. #include "student.h"
  6. class Widget : public QWidget
  7. {
  8.     Q_OBJECT
  9. public:
  10.     Widget(QWidget *parent = nullptr);
  11.     ~Widget();
  12. private:
  13.     Teacher*zt;
  14.     Student*st;
  15.     void classIsOver();
  16. };
  17. #endif // WIDGET_H
复制代码
widget.cpp
  1. #include "widget.h"
  2. Widget::Widget(QWidget *parent)
  3.     : QWidget(parent)
  4. {
  5.    /************信号与槽实验***********/
  6.    this->st=new Student(this); //初始化
  7.    this->zt=new Teacher(this);
  8.    connect(zt,&Teacher::hungry,st,&Student::treat);
  9.    classIsOver();
  10. }
  11. Widget::~Widget()
  12. {
  13. }
  14. void Widget::classIsOver()
  15. {
  16.     emit zt->hungry();
  17. }
复制代码
3、信号重载、槽重载

如果信号大概槽函数有重载,那么使用connect时,传入的地点需要举行处置惩罚,connect(zt,&Teacher::hungry,st,&Student::treat);会报错,产生二义性,无法区分到底是哪个版本的信号/槽函数。此时可以使用函数指针来声明地点。
以下面例子阐明:
  1. //Teacher.h
  2. #ifndef TEACHER_H
  3. #define TEACHER_H
  4. #include <QObject>
  5. class Teacher : public QObject
  6. {
  7.     Q_OBJECT
  8. public:
  9.     explicit Teacher(QObject *parent = nullptr);
  10. signals:
  11.     //自定义信号,写到signals下
  12.     //返回值void,只需要声明,不用实现
  13.     //可以有参数,可以重载
  14.     void hungry();
  15.     void hungry(QString foodname);
  16. };
  17. #endif // TEACHER_H
  18. //student.h
  19. #ifndef STUDENT_H
  20. #define STUDENT_H
  21. #include <QObject>
  22. #include <QDebug>
  23. class Student : public QObject
  24. {
  25.     Q_OBJECT
  26. public:
  27.     explicit Student(QObject *parent = nullptr);
  28. signals:
  29. public slots:
  30.     //早期Qt版本,必须写到public slots下,高级版本可以写到public或者全局下
  31.     //返回值void,需要声明、实现
  32.     //可以有参数,可以重载
  33.     void treat();
  34.     void treat(QString foodName);
  35. };
  36. #endif // STUDENT_H
  37. //widget.cpp
  38. #include "widget.h"
  39. Widget::Widget(QWidget *parent)
  40.     : QWidget(parent)
  41. {
  42.    /************信号与槽实验***********/
  43.    this->st=new Student(this);
  44.    this->zt=new Teacher(this);
  45. //   connect(zt,&Teacher::hungry,st,&Student::treat);
  46. //   classIsOver();
  47.    /************信号与槽重载实验***********/
  48.    void(Teacher:: *teacherSiganl)(QString)=&Teacher::hungry;
  49.    void(Student:: *studentSlot)(QString)=&Student::treat;
  50.    connect(zt,teacherSiganl,st,studentSlot);
  51.    classIsOver();
  52. }
  53. Widget::~Widget()
  54. {
  55. }
  56. void Widget::classIsOver()
  57. {
  58. //    emit zt->hungry();
  59.     emit zt->hungry("宫保鸡丁");
  60. }
复制代码
QString转为char*

  1.     //QString->char*  先转成QByteArray(.toUtf8),再转char*
  2.     qDebug()<<"请老师吃饭,吃"<<foodName.toUtf8().data();
复制代码
4、信号连接信号

信号是可以连接信号的
  1. /************信号连接信号实验***********/
  2. void(Teacher:: *teacherSiganl2)(void)=&Teacher::hungry;
  3. void(Student:: *studentSlot2)(void)=&Student::treat;
  4. //第一种 信号连接槽 ,槽里触发了信号
  5. // connect(btn2,&QPushButton::clicked,this,&Widget::classIsOver);
  6. //第二种 信号连接另一个信号
  7. connect(btn3,&QPushButton::clicked,zt,teacherSiganl2);
  8. //断开信号
  9. disconnect(btn3,&QPushButton::clicked,zt,teacherSiganl2);
  10. //Qt4版本,参数直观,缺点,类型不做检测
  11. connect(zt,SIGNAL(hungry()),st,SLOT(treat()));
复制代码


  • 一个信号是可以连接多个槽函数的
  • 多个信号可以连接同一个槽函数
  • 注意信号和槽函数的参数类型必须一一对应
  • 信号的参数可以多余槽函数的参数个数

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表