目录

  • 介绍
  • Qt中的信号和槽
  • 一般形式
  • 当发送信号的地方为静态函数时
  • 存在问题
  • 解决方案

介绍

信号和插槽用于对象之间的通信。信号和插槽机制是Qt的一个核心特性,可能是与其他框架提供的特性最为不同的部分。Qt的元对象系统使信号和插槽成为可能。

在GUI编程中,当我们更改一个小部件时,我们通常希望通知另一个小部件。更一般地说,我们希望任何类型的对象都能够相互通信。例如,如果用户单击“关闭”按钮,我们可能希望调用窗口的 Close()函数。

其他工具包使用回调实现这种通信。回调是指向函数的指针,因此如果希望处理函数通知您某个事件,请将指向另一个函数(回调)的指针传递给处理函数。处理函数然后在适当的时候调用回调。虽然使用此方法的成功框架确实存在,但是回调可能是非直观的,并且在确保回调参数的类型正确性方面可能会遇到问题。

Qt中的信号和槽

在Qt中,我们有一种回调技术的替代方法:使用信号和插槽。当特定事件发生时,会发出一个信号。Qt的小部件有许多预定义的信号,但是我们总是可以对小部件进行子类化,以便向它们添加我们自己的信号。插槽是响应特定信号而调用的函数。Qt的小部件有许多预定义的插槽,但通常的做法是对小部件进行子类化并添加自己的插槽,以便处理感兴趣的信号。(以上摘自Qt官方文档)

一般形式

下面为一般的信号槽形式。(案例摘自官方文档)

  // demo.h#include <QObject>class Counter : public QObject{Q_OBJECT                       // 必须要有public:Counter() { m_value = 0; }int value() const { return m_value; }public slots:void setValue(int value){if (value != m_value) {m_value = value;emit valueChanged(value);}}    signals:void valueChanged(int newValue);private:int m_value;};//demo.cppvoid Counter::setValue(int value){if (value != m_value) {m_value = value;emit valueChanged(value);}}Counter a, b;QObject::connect(&a, &Counter::valueChanged, &b, &Counter::setValue);a.setValue(12);     // a.value() == 12, b.value() == 12b.setValue(48);     // a.value() == 12, b.value() == 48

当发送信号的地方为静态函数时

当发送信号的地方为静态函数时,采用上述形式会报错,此时发送信号的类需要添加一个静态指针才能使用。

// demo.h#include <QObject>class Counter : public QObject{Q_OBJECT                         // 必须要有public:Counter() { m_value = 0; }static Counter* pointer_;          // 注意此处变化int value() const { return m_value; }public slots:static void setValue(int value)  // 要发送信号的地方为静态函数{if (value != m_value) {m_value = value;emit pointer_->valueChanged(value);    // 信号发送形式前面的加类静态指针引用}}  signals:void valueChanged(int newValue);private:int m_value;};//demo.cpp    用法Counter a, b;QObject::connect(&a, &Counter::valueChanged, &b, &Counter::setValue);a.setValue(12);     // a.value() == 12, b.value() == 12b.setValue(48);     // a.value() == 12, b.value() == 48

存在问题

  1. 上述信号只对代码执行第一次绑定的信号有效,如果多次connect,则后面的槽都不会响应。
  2. 一个类内部静态函数只能存在一种信号,如果有多种信号,则除了第一个外,后面的都没响应。

解决方案

在信号上加个枚举变量,用来区分信号的类别,并将此信号关联到另外一个非静态函数的槽中,然后在这个槽中通过枚举变量发送不同信号。

Qt静态函数中的信号和槽问题相关推荐

  1. Qt编程中的信号和槽机制

    Qt编程中的信号和槽机制 在使用自定义类创建一个按钮之后,只能看到一个按钮的图形,但是使用鼠标点击并无任何反应,下面想要实现一个"点击按钮可以关闭窗口"的功能. 关闭窗口的功能可以 ...

  2. Qt多线程中的信号与槽

    文章目录 1 多线程中的信号与槽 2 对象的依附性 2.1 对象的依附性 2.2 开启线程事件循环 2.3 线程事件循环的结束 2.4 设计实例 3 信号与槽的连接方式 3.1 Qt::DirectC ...

  3. Qt 多线程中地信号与槽

    Qt 多线程中地信号与槽 函数原型: 1 QObject::connect(const QObject *sender, const char *signal, const QObject *rece ...

  4. Qt中的信号与槽机制解析

    注:要想使用Qt的核心机制信号与槽,就必须在类的私有数据区声明Q_OBJECT宏,然后会有moc编译器负责读取这个宏进行代码转化,从而使Qt这个特有的机制得到使用. 所谓信号槽,简单来说,就像是插销一 ...

  5. Python Qt GUI设计:信号与槽的使用方法(基础篇—7)

    目录 1.信号与槽的概念 2.信号与槽的基础函数 2.1.创建信号函数 2.2.连接信号函数 2.3.断开信号函数 2.4.发射信号函数 3.信号和槽的使用方法 3.1.内置信号与槽的使用 3.2.自 ...

  6. Qt多线程使用 和 信号与槽传参 需要注意的问题

    Qt中提供了线程类,默认窗口是主线程,这个时候如果我们的业务逻辑很费时,就会一直使用主线程,页面可能会卡顿甚至崩溃.那么将业务逻辑放入子线程,能够避免页面的卡顿,保证操作是流畅的,还能提高程序的执行效 ...

  7. VS2008 Qt Designer 中自定义信号槽

    一.Qt Designer自定义槽函数 发现:在VS2008 +Qt4.7  中打开ui文件,所用的英文QT Designer工具,没有转到槽函数的功能,不如QtCreator自带的QtDesigne ...

  8. python qt designer 重定向_[Python自学] PyQT5-QTDesigner中关联信号和槽

    一.什么是信号什么是槽 信号和槽是QT的核心机制. 1.信号 信号,是由对象或空间发出去的消息.例如单击按钮控件. 信号可以理解为触发的事件. 2.槽 发送出去的信号需要有一段代码来拦截,并执行一些操 ...

  9. Qt中解决信号和槽不能使用自定义结构体的问题

    在Qt中信号和槽使用自定义的结构时,运行的时候发现报错不能识别结构体 解决办法: 一定要将自定义结构体定义为typedef struct 使用Q_DECLARE_METATYPE(结构体名),将结构体 ...

最新文章

  1. 重温java中的String,StringBuffer,StringBuilder类
  2. HTTP 301 跳转和302跳转的区别
  3. 小白的算法初识课堂(part6)--广度优先搜索
  4. 【XLL 框架库函数】 TempActiveCell/TempActiveCell12
  5. LeetCode OJ - Recover Binary Search Tree
  6. C 语言实例 - 判断闰年
  7. PyTorch的Tensor(张量)
  8. 利用Python进行数据分析--时间序列
  9. Oracle 12c中导入Oracle 11g的数据
  10. 全球与中国电动车PTC辅助加热器市场深度研究分析报告
  11. LaTeX2021 公式编写、图文安装、详细教程、一文读懂
  12. Hive分组 条件 分区排序 CLUSTER BY, Sort By,DISTRIBUTE BY
  13. oracle中的declare
  14. SATA-AHCI规范学习
  15. Vue 脚手架搭建目录及文件详解
  16. 【博学谷学习记录】超强总结,用心分享丨一种创新的表格
  17. getchar()函数的使用方法
  18. Linux下Oracle 11g安装(1)—— 系统安装篇
  19. Mysql 语句的优化技巧
  20. 七大设计原则(一):开闭原则

热门文章

  1. java文本框双击可编辑_JS实现双击内容变为可编辑状态
  2. 什么A股,B股,H股?什么是红筹股,蓝筹股?
  3. 计算机检测不到双显示器,win10系统双屏幕检测不到第二屏幕怎么办 解决双屏幕不显示的方法步骤...
  4. TCGA肿瘤数据分析专题
  5. DevExpress XPO 开发指南 简要
  6. java微信机器人_GitHub - linux-china/weixin-robot-java: 微信公共平台机器人Java SDK
  7. js:进制转换、保留指定位数小数、RGB/Hex颜色色值转换
  8. 旷视科技面试——算法岗
  9. 【全国大学生IoT设计竞赛】安谋科技灵动赛题国赛一等奖分享:多足仿生机器人
  10. Smart3D系列教程7之 《手动配置S3C索引加载全部的瓦片数据》