目录

信号槽

标准信号槽

自定义信号槽


信号槽

信号槽是Qt框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出的信号是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。
connect(sender,signal,receiver,slot);

  • sender:发出信号的对象
  • signal:发送对象发出的信号(函数地址)
  • receiver:接收信号的对象
  • slot:接收对象在接收到信号之后所需要调用的槽函数地址

优点:
松散耦合:信号的发送端和信号的接收端本身是没有关联的,通过connect函数将两端耦合在一起。

标准信号槽

练习:点击按钮关闭窗口

myWidget::myWidget(QWidget *parent): QWidget(parent)  //调用父类构造函数
{//创建一个按钮QPushButton *btn = new QPushButton;//btn->show(); //以顶层方式弹出窗口控件//让btn依赖在myWidget窗口中btn->setParent(this); //this指当前窗口btn->setText("关闭");btn->move(100,100);//点击按钮关闭窗口//参数1:信号发送者 参数2:发送的信号(函数地址) 参数3:信号接收者 参数4:处理槽函数地址connect(btn,&QPushButton::clicked,this,&QWidget::close);}myWidget::~myWidget()
{}

这里的clicked按钮中的标准信号,close关闭窗口函数是标准槽函数。

自定义信号槽

当Qt提供的信号和槽函数无法满足需求时,就需要用到自定义信号槽,使用emit来发出信号。

练习:定义老师和学生类继承QWidget,老师发出下课信号,学生响应请吃饭

teache.h

#ifndef TEACHER_H
#define TEACHER_H#include <QObject>class Teacher : public QObject
{Q_OBJECT
public:explicit Teacher(QObject *parent = nullptr);signals://自定义信号,写道signals下//返回值时void,秩序申明,不需要实现//可以有参数,可以重载void hangry();public slots:};#endif // TEACHER_H

student.h

#ifndef STUDENT_H
#define STUDENT_H#include <QObject>class Student : public QObject
{Q_OBJECT
public:explicit Student(QObject *parent = nullptr);signals:public slots:
//    早期Qt版本需要写到public slots下,高级版本可以写到public或全局下
//    返回值为void,需要声明,也需要实现
//    可以有参数,可以发生重载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 <QWidget>
#include "teacher.h"
#include "student.h"namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;Teacher *te;Student *st;
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>//Teacher类
//Student类
//下课后 老师会触发一个信号,饿了,学生响应信号,请客吃饭
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//创建老师对象this->te = new Teacher(this);//创建学生对象this->st = new Student(this);//连接老师和学生connect(te,&Teacher::hangry,st,&Student::treat);//发出信号emit te->hangry();}Widget::~Widget()
{delete ui;
}

信号槽的重载

重载的信号槽,需要构造信号和槽函数对应的重载函数的指针,让信号在连接时可以找到对应的重载函数。

练习:定义老师和学生类继承自QWidget,老师发出下课信号,饿了,想吃宫保鸡丁,学生响应请老师吃宫保鸡丁。

在teacher.h中增加有参的信号

void hangry(QString foodName);

在student.h中增加有参的槽函数

void treat(QString foodName);

在student.cpp中实现带参数的重载槽函数

void Student::treat(QString foodName)
{//qDebug打印Qstring时带引号,转为char *就不带引号、、//转换:先转成QByteArrey,再转char * ->foodName.toUtf8().data()qDebug()<<"请老师吃:"<<foodName.toUtf8().data();
}

在widget.cpp中连接信号槽

//连接重载的信号和槽
//指针 -> 指向地址
//函数指针 -> 指向函数的指针
void(Teacher:: *teacherSignal)(QString) = &Teacher::hangry;
void(Student:: *studentSlot)(QString) = &Student::treat;
connect(te,teacherSignal,st,studentSlot);
//发出信号
emit te->hangry("宫保鸡丁");

可以用disconnect()函数取消信号的槽连接。

Qt信号槽机制详解及案例相关推荐

  1. 学习QT之信号槽机制详解

    学习QT之信号槽机制详解 一.Qt信号槽机制 概念:信号槽是Qt框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如:按钮检测到自己被点击了一下,它就会发出一个信号(sig ...

  2. Qt信号槽机制-传递自定义数据类型(qRegisterMetaType)

    Qt信号槽机制-传递自定义数据类型qRegisterMetaType 前言 前言 通过Qt内置的数据类型进行信号与槽参数传递很方便:如果是自己定义的类型如果想使用signal/slot来传递的话,则没 ...

  3. Hello Qt——Qt信号槽机制源码解析

    基于Qt4.8.6版本 一.信号槽机制的原理 1.信号槽简介 信号槽是观察者模式的一种实现,特性如下: A.一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知: B.一个槽就是一个观察 ...

  4. c++实现Qt信号槽机制

    信号槽机制的原理 信号槽是观察者模式的一种实现,或者说是一种升华: 一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知: 一个槽就是一个观察者,通常就是在被观察的对象发生改变的时候-- ...

  5. 深入理解Qt信号槽机制

    1. 信号和槽概述 > 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式(发布-订阅模式).当某个`事件`发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(s ...

  6. c++模拟qt信号槽机制

    qt的信号槽原理:moc元对象编译器翻译头文件成moc文件,实现头文件中的信号的函数体和申明信号.槽的索引,加上一个qt_static_metacall的函数等等,然后在connect中的QObjec ...

  7. Qt信号与槽机制详解1-创建一个带信号和槽的例子

    目录 一.编译一个例子 1.hello.h中的内容 2.hello.cpp的内容 3.main.cpp中的内容 4.tutorial.pro内容 二.moc_hello.cpp文件 1.Q_OBJEC ...

  8. QML与Qt C++ 交互机制详解

    介绍 QML和 C++对象可以通过,signals,slots和 属性修改进行交互.对于一个C++对象,任何数据都可以通过Qt的 Meta-Object System暴露给QML(何总方法,后面介绍) ...

  9. C++框架_之Qt的信号和槽的详解

    目录 C++_之Qt的信号和槽的详解 1.概述 1.1对象树(子对象动态分配空间不需要释放) 2.信号和槽 Qt5 的书写方式:(推荐的使用)★★★★★ Qt4 的书写方式: 3.自定义信号槽 3.1 ...

最新文章

  1. jquery easyui datagrid 排序列
  2. 公积金联名卡——提取公积金用,用身份证即可办理
  3. 先装VS 在装IIS遇到的问题
  4. java github_GitHub Research:超过50%的Java记录语句写错了
  5. 前端学习(2218):react元素渲染之函数式函数式编程
  6. 牛客网---Java题库(1~10)
  7. 数组元素的填充与替换、排序和复制
  8. java的split的源码_Spring 的split()方法源码部分分析
  9. JavaScript与C#互通的DES加解密算法
  10. unity3D 音效的设置 音效的开关 制作声音的开关按钮
  11. Injective Protocol官方文档翻译(九) -清盘、清算(Liquidation)
  12. 【转】DICOM医学图像处理:浅析SWF、MWL、SPS、MPPS
  13. 双向可控硅晶片光耦 (TLP160J TLP260J TLP525G) 基本原理及应用实例
  14. 防火墙阻止应用程序linux,win10系统下如何解除被防火墙阻止运行的应用程序
  15. jQuery学习笔记总结
  16. 发现一个不错的导航网站:site114网站导航
  17. 在C#中实现SQLite的事务处理
  18. 完成一条微指令四周期英文全称
  19. shell小技巧(一百三十三)n个人报数出局游戏
  20. 2008北京地铁线路图

热门文章

  1. ubuntu18.04安装截图软件shutter
  2. php laravel入口文件,Laravel 应用的入口:路由系列之基础入门篇
  3. 2021-工程实践与创新大赛-智能物流搬运
  4. Java 字符串取前两位_java怎么获取字符串的前几位字符
  5. Vim 进阶操作-移动
  6. android自定义Drawable实现炫酷UI-锦鲤游泳效果
  7. Datatables 隐藏列
  8. 20线程测试cpu性能软件,3DMark推出CPU专用测试工具CPU Profile,可对比不同线程下的CPU性能...
  9. Python:flake8_E501_E128_E125
  10. Windows 98 安装全程图解 一看就会(转)