Qt是一个跨平台的C++应用程序开发框架,被广泛用于开发GUI程序。

信号和槽是Qt的核心,就相当于MFC的消息传递和回调函数一样。只不过功能比MFC 消息处理的机制和回调函数更强大。GUI应用程序要对用户操作做出响应。例如,当用户单击菜单项目或者工具栏按钮时,GUI应用程序便会执行某段代码。实际上,我们更希望任何一类对象均可彼此互相通信。编程人员必须将事件与相关代码相关联。老的开发工具套件(Toolkit)使用的机制不是类型安全(type-safe)的(例如,容易引起崩溃),缺乏灵活性而且不是面向对象的:

Qt Company创造了一种名为“信号和槽”的解决方案:信号和槽机制是一种功能强大的对象间通信机制,完全可以取代老旧的开发套件所使用的粗糙的回调和消息映射。信号和槽机制极为灵活,完全面向对象,并且使用C++来实现。

使用原有回调机制,若要将某一代码与按钮关联在一起,必须将函数指针传输给该按钮,单击此按钮时,系统将调用此函数。而对于老的工具套件而言,调用此函数时,它不确保将正确类型的参数传递给该函数,这样很有可能导致崩溃:回调方法的另一问题是:它将GUI元素与功能紧紧地捆綁在一起,这样导致很难独立开发类。

而Qt的信号和槽机制则不同。发生事件时,Qt窗体将会发出信号。例如,单击某一按钮时,该按钮将发出“clicked”信号,编程人员要想连接一个信号可以创建一个函数(即“槽”)、并调用connect()函数将信号与槽关联起来。Qt的信号和槽机制不要求各类彼此感知,这样可以更轻松地开发极易重新使用的类。由于信号和槽属于类型安全的,因此,类型错误都将报告为警告,因此不会发生崩溃。

1 新建项目

2 基类选择

3 添加新文件

4 设置类名

5 头文件中声明信号(发送信号窗口)

//MyDialog.hclass MyDialog : public QDialog{ Q_OBJECTpublic: explicit MyDialog(QWidget *parent = 0); ~MyDialog();private: Ui::MyDialog *ui;signals: void dlgReturn(int); // 自定义的信号};

6 mydialog.ui中添加两个控件(发送信号窗口)

7 添加Button的单击信号clicked()对应的槽(一种特殊的消息/槽结合机制,最后有说明),并在其中发射信号(MyDialog.cpp,发送信号窗口)

//MyDialog.cppvoid MyDialog::on_pushButton_clicked(){ int value = ui->spinBox->value(); // 获取输入的数值 emit dlgReturn(value); // 发射信号 close(); // 关闭对话框}

8 声明自定义槽(widget.h,接收窗口)

//widget.hclass Widget : public QWidget{ Q_OBJECTpublic: explicit Widget(QWidget *parent = 0); ~Widget();private: Ui::Widget *ui;private slots: //自定义槽 void showValue(int value);};

9 widget.ui窗口中添加一控件

(届时用于接收信息反馈)

10 widget.cpp中添加头文件并在构造函数中添加信号与槽的关连代码,以及调用Mydialog窗口的代码(接收信号窗口)

//widget.cpp#include "mydialog.h"……Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){ ui->setupUi(this); MyDialog *dlg = new MyDialog(this); connect(dlg, &MyDialog::dlgReturn, this, &Widget::showValue); //信号与槽的关连 dlg->show();}

11 widget.cpp中实现自定义槽(接收信号窗口)

//widget.cppvoid Widget::showValue(int value) // 自定义槽{ ui->label->setText(tr("获取的值是:%1").arg(value));}

12 运行效果

点击确定后:

13 信号和槽的深入分析

在Qt中,使用了信号和槽来进行对象间的通信。当一个特殊的事情发生时便可以发射一个信号,比如按钮被单击;而槽就是一个函数,它在信号发射后被调用,来响应这个信号。在Qt的部件类中已经定义了一些信号和槽,但是更多的做法是子类化这个部件,然后添加自己的信号和槽来实现想要的功能。

一个信号可以关联到多个槽上,多个信号也可以关联到同一个槽上,甚至,一个信号还可以关联到另一个信号上。如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,执行顺序与关联顺序相同。

13.1 声明信号(发送窗口)

例如:

signals: void dlgReturn(int); // 自定义的信号

声明一个信号要使用signals关键字。

在signals前面不能使用public、private和protected等限定符,因为只有定义该信号的类及其子类才可以发射该信号。

信号只用声明,不需要也不能对它进行定义实现。

信号没有返回值,只能是void类型的。

只有QObject类及其子类派生的类才能使用信号和槽机制,使用信号和槽,还必须在类声明的最开始处添加Q_OBJECT宏。

13.2 发射信号(发射窗口)

void MyDialog::on_pushButton_clicked() // 确定按钮{ int value = ui->spinBox->value(); // 获取输入的数值 emit dlgReturn(value); // 发射信号 close(); // 关闭对话框}

当单击确定按钮时,便获取spinBox部件中的数值,然后使用自定义的信号将其作为参数发射出去。发射一个信号要使用emit关键字,例如程序中发射了dlgReturn()信号。

13.3 声明和实现自定义槽(接收窗口)

private slots: void showValue(int value);……void Widget::showValue(int value) // 自定义槽{ ui->label->setText(tr("获取的值是:%1").arg(value));}

声明一个槽需要使用slots关键字。一个槽可以是private、public或者protected类型的,槽也可以被声明为虚函数,这与普通的成员函数是一样的,也可以像调用一个普通函数一样来调用槽。槽的最大特点就是可以和信号关联。

13.4 信号和槽的关联(接收窗口)

MyDialog *dlg = new MyDialog(this); connect(dlg,SIGNAL(dlgReturn(int)),this,SLOT(showValue(int)));

connect()函数原型如下:

bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection )

第一个参数为发送信号的对象,例如这里的dlg;

第二个参数是要发送的信号,这里是SIGNAL(dlgReturn(int));

第三个参数是接收信号的对象,这里是this,表明是本部件,即Widget,当这个参数为this时,也可以将这个参数省略掉,因为connect()函数还有另外一个重载形式,该参数默认为this;

第四个参数是要执行的槽,这里是SLOT(showValue(int))。

对于信号和槽,必须使用SIGNAL()和SLOT()宏,它们可以将其参数转化为const char* 类型。connect()函数的返回值为bool类型,当关联成功时返回true。

信号和槽的参数只能有类型,不能有变量,例如写成SLOT(showValue(int value))是不对的。对于信号和槽的参数问题,基本原则是信号中的参数类型要和槽中的参数类型相对应,而且信号中的参数可以多于槽中的参数,但是不能反过来,如果信号中有多余的参数,那么它们将被忽略。

connect()函数的最后一个参数,它表明了关联的方式,其默认值是Qt::AutoConnection,这里还有其他几个选择,具体功能如下表所示 。

14 使用信号和槽注意事项

需要继承自QObject或其子类;

在类声明的最开始处添加Q_OBJECT宏;

槽中的参数的类型要和信号的参数的类型相对应,且不能比信号的参数多;

信号只用声明,没有定义,且返回值为void类型。

15 信号和槽的自动关联方式

信号和槽还有一种自动关联方式,比如在设计模式直接生成的“确定”按钮的单击信号的槽,就是使用的这种方式:

on_pushButton_clicked()

它由“on”、部件的objectName和信号三部分组成,中间用下划线隔开。这样组织的名称的槽就可以直接和信号关联,而不用再使用connect()函数。

-End-

qwidget show 是否有信号_QT中的消息传递与函数回调机制:信号(signal)和槽(slot)...相关推荐

  1. [转载]qt信号signal和槽slot机制

    好东西! 原文地址:qt信号signal和槽slot机制作者:fox1987 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注 ...

  2. PyQt5 信号(Signal)与槽(Slot)

    PyQt5 信号与槽 信号与槽介绍 内置信号与槽的使用 自定义信号与槽的使用 自定义信号和内置槽函数 自定义信号和自定义槽函数 自定义有参信号 使用自定义信号参数 装饰器信号与槽 信号与槽的断开和连接 ...

  3. Qt核心特性之 —— 「信号(Signal)与槽(Slot)」机制

    目录 1.Qt 与 Qt Creator简介: 2.关于引用头文件的一些事儿: 3.信号(Signal)与槽(Slot)机制: 3.1.一个小例子: 4.自定义信号与槽: 4.1.运行效果: 5.信号 ...

  4. PyQt5 中信号signal 与 槽 slot 的相关知识

    博文视点 文章写得太好了 转载学习 感谢 https://blog.csdn.net/broadview2006/article/details/78475842 在Qt中,每一个QObject对象和 ...

  5. qt qthead里如何响应信号_Qt 中的多线程技术(翻译)

    原文链接 Multithreading Technologies in Qt​doc.qt.io 正文 Qt 提供一系列的类与函数来处理多线程.Qt 开发者们可以使用下面四种方法来实现多线程应用. Q ...

  6. 【Linux学习】信号——信号保存 | 信号处理 | 不可重入函数,volatile,SIGCHLD信号

  7. Python分析离散心率信号(中)

    Python分析离散心率信号(中) 一些理论和背景 心率信号不仅包含有关心脏的信息,还包含有关呼吸,短期血压调节,体温调节和荷尔蒙血压调节(长期)的信息.也(尽管不总是始终如一)与精神努力相关联,这并 ...

  8. 计算机技术在铁路中的应用,计算机容错技术在铁路信号系统中的应用

    计算机容错技术在铁路信号 系统中的应用 张仕雄 (武汉铁路职业技术学院,湖北武汉430063) 摘 要:着重介绍了计算机容错技术的概念及实现方法.阐述了硬件冗余的工作原理及其在铁路信号系统中的应用. ...

  9. c语言删增,C语言中初始、增加和删除进程信号的操作方法简介

    C语言sigemptyset()函数:初始化信号集头文件: #include 定义函数: int sigemptyset(sigset_t *set); 函数说明:sigemptyset()用来将参数 ...

最新文章

  1. python编程分析了一下高考那些事,发现了两个之最,原来是这样
  2. 你知道element中el-table的列名中不能含有 . 吗?
  3. Optimize Search Results
  4. arduino 嗡鸣器 音乐_[求助]怎样实现红外遥控蜂鸣器播放音乐,求大神指正
  5. Chrome Native Client 原理
  6. 背景选择器selector替换按钮默认背景
  7. 《Go语言程序设计》读书笔记(十)反射
  8. silverlight实现图片局部放大效果
  9. DeDe调用指定栏目ID下的文章
  10. 关于runc漏洞CVE-2019-5736的修复公告 1
  11. 32位java8,jdk8下载,解压版
  12. Tableau 中国最美八条骑行线路(一)线路地图
  13. 基于SSH会员积分消费管理系统
  14. 未能找到主机服务器怎么回事,未能找到主机名的服务器怎么解决
  15. r720服务器独立显卡显示,dell服务器进入bios独立显卡(dellr720安装独立显卡)
  16. 公安部称游街示众的执法方式严重违规
  17. p标签内不能包含块级元素
  18. 637. Average of Levels in Binary Tree
  19. 创业之路 - 上市公司包括哪几种,创业板、新三板、科创版 区别?
  20. Unity3d 获取场景中摄像头视频流,实现直播效果(无需代码)

热门文章

  1. javax.servlet.http.HttpServletResponse接口(HTTP版本)
  2. 一个整合SQL语句的类
  3. c语言switch做一个计算器,超级新手,用switch写了个计算器程序,求指导
  4. Mysql多源复制半同步_MySQL多源复制搭建
  5. 生成xml_freemarker快速生成xml文件
  6. 大学c语言python_C语言和Python爬虫哪个好?老男孩IT教育
  7. 支持MySql的数据库自动分表工具DBShardTools发布
  8. PPT,要你好看(全彩)pdf
  9. 【后缀数组】洛谷P3809模板题
  10. C#调用天气查询服务