Qt静态函数中的信号和槽问题
目录
- 介绍
- 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
存在问题
- 上述信号只对代码执行第一次绑定的信号有效,如果多次connect,则后面的槽都不会响应。
- 一个类内部静态函数只能存在一种信号,如果有多种信号,则除了第一个外,后面的都没响应。
解决方案
在信号上加个枚举变量,用来区分信号的类别,并将此信号关联到另外一个非静态函数的槽中,然后在这个槽中通过枚举变量发送不同信号。
Qt静态函数中的信号和槽问题相关推荐
- Qt编程中的信号和槽机制
Qt编程中的信号和槽机制 在使用自定义类创建一个按钮之后,只能看到一个按钮的图形,但是使用鼠标点击并无任何反应,下面想要实现一个"点击按钮可以关闭窗口"的功能. 关闭窗口的功能可以 ...
- Qt多线程中的信号与槽
文章目录 1 多线程中的信号与槽 2 对象的依附性 2.1 对象的依附性 2.2 开启线程事件循环 2.3 线程事件循环的结束 2.4 设计实例 3 信号与槽的连接方式 3.1 Qt::DirectC ...
- Qt 多线程中地信号与槽
Qt 多线程中地信号与槽 函数原型: 1 QObject::connect(const QObject *sender, const char *signal, const QObject *rece ...
- Qt中的信号与槽机制解析
注:要想使用Qt的核心机制信号与槽,就必须在类的私有数据区声明Q_OBJECT宏,然后会有moc编译器负责读取这个宏进行代码转化,从而使Qt这个特有的机制得到使用. 所谓信号槽,简单来说,就像是插销一 ...
- Python Qt GUI设计:信号与槽的使用方法(基础篇—7)
目录 1.信号与槽的概念 2.信号与槽的基础函数 2.1.创建信号函数 2.2.连接信号函数 2.3.断开信号函数 2.4.发射信号函数 3.信号和槽的使用方法 3.1.内置信号与槽的使用 3.2.自 ...
- Qt多线程使用 和 信号与槽传参 需要注意的问题
Qt中提供了线程类,默认窗口是主线程,这个时候如果我们的业务逻辑很费时,就会一直使用主线程,页面可能会卡顿甚至崩溃.那么将业务逻辑放入子线程,能够避免页面的卡顿,保证操作是流畅的,还能提高程序的执行效 ...
- VS2008 Qt Designer 中自定义信号槽
一.Qt Designer自定义槽函数 发现:在VS2008 +Qt4.7 中打开ui文件,所用的英文QT Designer工具,没有转到槽函数的功能,不如QtCreator自带的QtDesigne ...
- python qt designer 重定向_[Python自学] PyQT5-QTDesigner中关联信号和槽
一.什么是信号什么是槽 信号和槽是QT的核心机制. 1.信号 信号,是由对象或空间发出去的消息.例如单击按钮控件. 信号可以理解为触发的事件. 2.槽 发送出去的信号需要有一段代码来拦截,并执行一些操 ...
- Qt中解决信号和槽不能使用自定义结构体的问题
在Qt中信号和槽使用自定义的结构时,运行的时候发现报错不能识别结构体 解决办法: 一定要将自定义结构体定义为typedef struct 使用Q_DECLARE_METATYPE(结构体名),将结构体 ...
最新文章
- 重温java中的String,StringBuffer,StringBuilder类
- HTTP 301 跳转和302跳转的区别
- 小白的算法初识课堂(part6)--广度优先搜索
- 【XLL 框架库函数】 TempActiveCell/TempActiveCell12
- LeetCode OJ - Recover Binary Search Tree
- C 语言实例 - 判断闰年
- PyTorch的Tensor(张量)
- 利用Python进行数据分析--时间序列
- Oracle 12c中导入Oracle 11g的数据
- 全球与中国电动车PTC辅助加热器市场深度研究分析报告
- LaTeX2021 公式编写、图文安装、详细教程、一文读懂
- Hive分组 条件 分区排序 CLUSTER BY, Sort By,DISTRIBUTE BY
- oracle中的declare
- SATA-AHCI规范学习
- Vue 脚手架搭建目录及文件详解
- 【博学谷学习记录】超强总结,用心分享丨一种创新的表格
- getchar()函数的使用方法
- Linux下Oracle 11g安装(1)—— 系统安装篇
- Mysql 语句的优化技巧
- 七大设计原则(一):开闭原则
热门文章
- java文本框双击可编辑_JS实现双击内容变为可编辑状态
- 什么A股,B股,H股?什么是红筹股,蓝筹股?
- 计算机检测不到双显示器,win10系统双屏幕检测不到第二屏幕怎么办 解决双屏幕不显示的方法步骤...
- TCGA肿瘤数据分析专题
- DevExpress XPO 开发指南 简要
- java微信机器人_GitHub - linux-china/weixin-robot-java: 微信公共平台机器人Java SDK
- js:进制转换、保留指定位数小数、RGB/Hex颜色色值转换
- 旷视科技面试——算法岗
- 【全国大学生IoT设计竞赛】安谋科技灵动赛题国赛一等奖分享:多足仿生机器人
- Smart3D系列教程7之 《手动配置S3C索引加载全部的瓦片数据》