Qt修炼手册4_信号与槽
1.前言
为了处理个体间的通信事件,Qt提供了信号与槽。信号与槽不仅可以处理GUI上发生的事件,也可以实现个体间的数据通信。值得深入把握。
2.信号与槽
信号与槽是一种用于对象间通信的机制。为了用户在GUI程序点击按钮控件时可运行指定函数,信号与槽提供可运行指定函数的框架。处理多种用户事件前,信号和槽提供多种回调(Callback)函数。
Qt提供的所有控件拥有多种预设信号。例如,QPushButton控件的单击(click)双击(double click)、鼠标经过(mouse over)等多重信号。同时,槽也提供了多种虚函数(virtual function)。
信号用于处理发生的事件,而槽则是指定从信号接受事件的处理函数。因此,可以将信号和槽视为一个管道(pipeline).
根据上面的描述,我们也能注意到一个很重要的一点:信号与槽通常不是1:1匹配的。一个信号可以关联多个槽,一个槽也可以关联多个信号。示意图如下:
信号与槽之间的关联函数是connect函数。
3.典型实例
主文件 main.cpp:
#include "mysigslot.h" #include <QtWidgets/QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);mySigSlot w;w.resize(400, 300);w.setWindowTitle("Example for Signal-Slot");w.show();return a.exec(); }
头文件 mySigSlot.h:
#ifndef MYSIGSLOT_H #define MYSIGSLOT_H#include <QtWidgets/QWidget> #include "ui_mysigslot.h" #include <qlabel.h> /*********************************************************/ class mySigSlot : public QWidget {Q_OBJECTpublic:mySigSlot(QWidget *parent = 0);~mySigSlot();private:Ui::mySigSlotClass ui; private:QLabel* lbl; }; /*********************************************************/ class SignalSlot : public QObject {Q_OBJECT public:SignalSlot() { m_value = 0; }int value() const { return m_value; }public slots :void setvalue(int value);signals:void valueChanged(int newvalue);private:int m_value; }; /*********************************************************/ #endif // MYSIGSLOT_H
源文件 mySigSlot:
#include "mysigslot.h"mySigSlot::mySigSlot(QWidget *parent): QWidget(parent) {ui.setupUi(this);lbl = new QLabel("",this);lbl->setGeometry(10, 10, 100, 40);SignalSlot s1, s2;QObject::connect(&s1, SIGNAL(valueChanged(int)),&s2, SLOT(setvalue(int)));s1.setvalue(100);lbl->setText(QString("%1").arg(s2.value())); } mySigSlot::~mySigSlot() { }void SignalSlot::setvalue(int value) {m_value = value; //assignment//为了发送信号 使用关键字emitemit valueChanged(m_value); //emit signal }
实现结果:
![]()
信号与槽的流通过程:
首先定义原则“s1 的 valueChanged()函数被触发,那么s2将被赋予与s1相同的值”。先对s1赋值,该过程激发了信号函数s1.valueChanged(),从而相应“信号-槽”管道,s2.value()获得新值。最后显示在QLabel控件上。
4.参考资料
[1]. 金大 [zhen. Qt 5开发实战[M]. 人民邮电出版社, 2015.
Qt修炼手册4_信号与槽相关推荐
- Qt编程中的信号和槽机制
Qt编程中的信号和槽机制 在使用自定义类创建一个按钮之后,只能看到一个按钮的图形,但是使用鼠标点击并无任何反应,下面想要实现一个"点击按钮可以关闭窗口"的功能. 关闭窗口的功能可以 ...
- Python Qt GUI设计:信号与槽的使用方法(基础篇—7)
目录 1.信号与槽的概念 2.信号与槽的基础函数 2.1.创建信号函数 2.2.连接信号函数 2.3.断开信号函数 2.4.发射信号函数 3.信号和槽的使用方法 3.1.内置信号与槽的使用 3.2.自 ...
- Qt多线程中的信号与槽
文章目录 1 多线程中的信号与槽 2 对象的依附性 2.1 对象的依附性 2.2 开启线程事件循环 2.3 线程事件循环的结束 2.4 设计实例 3 信号与槽的连接方式 3.1 Qt::DirectC ...
- Qt修炼手册11_多线程编程和QThread类
1.事件循环 学习QT多线程编程之前,有必要先熟悉事件循环的概念. 先看一个单线程界面程序的主函数代码: int main(int argc, char* argv[]) {QApplication ...
- Qt修炼手册9_Ui名字空间及setupUi()原理解读
1.前言 用最新的QtCreator选择GUI的应用会产生含有如下文件的工程: 1.1 *.pro文件 QT += core gui //使用Qt的Core和Gui模块.QT将自己的库函数分为多个模块 ...
- QT对象树、信号和槽机制
文章目录 一 .对象树是什么? 二.信号和槽的基本概念 2.1 信号 2.2 槽 2.3 松散耦合 2.4 特点 三.示例 总结 一 .对象树是什么? 对象树是由父类和若干子类对象组成,而子类也可以由 ...
- Qt线程间通信-信号与槽通信
线程间通信: 1.自定义事件:postEvent(): 2.信号与槽[本质也是通过自定义事件实现的] 注意:每个线程都有自己的事件循环 下面先说明下信号与槽的通信: 下面这个程序的运行截图 模拟下载! ...
- Qt工作笔记-使用信号与槽让两个界面进行数据通信
今天在项目中,发现有一个十分重要的功能,就是2个界面进行数据通信. 记得1年多前,刚刚学习Qt,对这个无法理解,然后经过一年多的学习和理解,在此把自己学习的感悟和知识在此总结下. 下面是使用emit ...
- QT学习小结之信号与槽
信号与槽函数是我们学习QT必备的基础知识,今天跟大家分享我学习QT的一些总结吧. 信号槽机制是Qt编程的基础.通过信号槽,能够使Qt各组件在不知道对方的情形下能够相互通讯. 槽函数和普通的C++成员函 ...
最新文章
- MonoCon:使用辅助学习的单目3D目标检测框架(AAAI 2022)
- Linux驱动程序中的file,inode,file_operations三大结构体
- 支付宝开放平台开发助手_支付宝:如何创建和接入支付宝电脑网站支付-新手必备...
- 【论文写作】客户端设计与实现中各模块设计如何写
- Kafka对Java程序员有多重要?连阿里都在用它处理亿万级数据统计
- android ttc字体,android从ttc字体设置默认字体和字体系列
- 自检、开机故障及主板厂商资料
- 报错:【pip Error】ERROR: Cannot determine archive format of C:\Users\YDD\AppData\Local\Temp\pip-req-buil
- win7系统中安装破解版Charles教程 基本使用方法汇总
- linux每日命令(3):ln命令
- 网钛CMS采集插件-无需登陆自动采集发布插件
- 【vim环境配置】详细实录
- 写博客的2年,我有12万+粉丝了,还上了百度百科!
- oracle自学OCA,上海学习oracle OCA
- 2018TLC大会精彩回顾
- php让浏览器全屏,js实现各浏览器全屏代码
- 机器学习基石2-Learning to Answer Yes-No
- pytorch--切断梯度的方法
- 超神学院的宇宙天体计算机,正文 第一章:银河之力被一分为二
- java 删除oss 文件
热门文章
- 利用Inotify和Rsync将webproject文件自己主动同步到多台应用server
- android 汉字转拼音pinyin4j包
- 关于在linux下搭建VSFTP下匿名不能上传的问题
- 语言特性与API设计
- 企业级UML/MDA工具Trufun 2007系列发布!
- hud-1495--非常可乐 VS nyoj-21--三个水杯
- NYOJ 70 阶乘因式分解(二)
- python爬虫---实现项目(二) 分析Ajax请求抓取数据
- 练习:利用函数实现一个登陆系统
- 轻松自动化---selenium-webdriver(python) (十二)