Qt图形界面编程入门(信号和槽通信机制)

信号和槽机制是Qt的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信。

声明了信号的对象,当其状态改变时,信号就由该对象发送出去,而且该对象只负责发送信号,它不知道另一端是谁在接收这个信号

槽用于接收和处理信号,一个槽并不知道是否有任何信号与自己相连接

槽实际上只是普通的对象成员函数。当一个信号被发射时,与其相关的槽将被立即执行,就像一个正常的函数调用一样。

信号与槽机制完全独立于任何GUI事件循环

信号

①信号(signal)的声明是在一个类的头文件中进行的

②Qt的signal关键字指出进入了信号声明区,随后即可声明自己的信号

例如:

signals:void stateChanged(int nNewVal); //定义信号

这里signals是Qt的关键字,而非C++的关键字。

信号函数stateChanged定义了信号stateChanged,这个信号带有参数nNewVal

信号函数语法受到以下几点约束:

①函数返回值是void类型,因为触发信号函数的目的是执行与其绑定的槽函数,无须信号函数返回任何值。

②开发人员只能声明而不能实现信号函数。

③信号函数被moc自动设置为protected,因而只有包含一个信号函数的那个类及其派生类才能使用该信号函数。

④信号函数的参数个数、类型由开发人员自行设定。这些参数的职责是封装类的状态信息,并将这些信息传递给槽函数。

⑤只有QObject及其派生类才可以声明信号函数

①槽函数和普通的C++成员函数一样,可以被正常调用。

②槽唯一的特殊性就是很多信息可以与其相关联。

③当与其关联的信号被发送时,这个槽就会被调用。

④槽可以有参数,但槽的参数不能有默认值。关键字slots表名进入了槽函数声明区。

槽的声明也是在头文件中进行的,例如:

public slots:   //此语句说明后面就是槽函数void Function(int nNewVal){qDebug() << "new Values" << nNewVal;  //显示变量    }

槽函数的返回值是void类型,因为信号和槽机制是单向的:信号被发送后,与其绑定的槽函数会被执行,但不要求槽函数返回任何执行结果。和信号函数一样,只有QObject及其派生类才可以定义槽函数。

既然槽函数是普通的成员函数,因此与其他的函数一样,它们也有存取权限(public,protected,private)。也就是说,人们能控制其他类能够以怎样的方式调用一个函数。

关联信号与槽

通过调用QObject::connect函数可以绑定一个信号函数和一个槽函数,该函数最常用的格式如下:

connect(sender,SIGNAL(signal_func()),receiver,SLOT(slot_func()))

其中sender及receiver都是指向QObject(或其子类)对象的指针

前者指向发送信号的对象,后者指向处理信号的对象,两者分别被称为“发送者”及“接收者”。

signal_func以及slot_func分别是这两个对象中定义的信号函数和槽函数。

当指定信号signal时一般使用Qt的宏SIGNAL,指定槽函数时必须使用宏SLOT。

一个信号函数可以和多个槽函数绑定。

多个信号函数可以和一个槽函数绑定。

使用信号和槽机制时应该注意以下几点:

①信号和槽机制与普通函数调用一样,如果使用不当,在程序执行时也有可能产生死循环

②如果一个信号与多个槽相联系,那么当这个信号被发送时,与之相关的槽被激活的顺序将是随机的

③宏定义不能用在信号和槽的参数中。

④信号和槽的参数个数与类型必须一致

信号和槽举例

 

再次建立头文件

exampleA.h,修改其内容为

#ifndef EXAMPLEA_H
#define EXAMPLEA_H
#include<QCoreApplication>
class CExampleA:public QObject
{Q_OBJECTint m_Value;// 定义私有成员
public:CExampleA(){m_Value = 0;}void SetValue(int nNewVal){if (m_Value ==  nNewVal){ return ; }m_Value = nNewVal;// emit函数用来激活信号函数,发送信号emit stateChanged(m_Value);}
signals:  // 定义信号函数,带参数void stateChanged(int nNewVal);
};
#endif // EXAMPLEA_H

 exampleB.h,修改其内容为

#ifndef EXAMPLEB_H
#define EXAMPLEB_H
#include<QDebug>  //包含调式类
#include<QCoreApplication>
class CExampleB:public QObject
{Q_OBJECT
public:CExampleB(){}
public slots:  //定义槽函数void Function(int nNewVal)  //nNewVal为100{qDebug() << "new Values" << nNewVal;}
};#endif // EXAMPLEB_H

 再次打开新建对话框,添加主函数文件

 

main.cpp中修改为

 

#include<exampleA.h>
#include<exampleB.h>
int main()
{CExampleA a;   //创建CExampleA类的对象a,调用构造函数,m_Value = 0CExampleB b;   //创建CExampleB类的对象b//连接信号和槽,connect函数要求发送对象和接收对象均为指针,a,b是对象名,&a,&b是发送对象的指针和接收对象的指针。QObject::connect(&a,SIGNAL(stateChanged(int)),&b,SLOT(Function(int)));a.SetValue(100);  //调用a对象的公有函数return 0;
}

运行

简单实现了信号与槽的功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python二级笔记(18,19合集知识点篇)

知识点&#xff1a; 1&#xff0c;软件测试的目的是发现程序中的错误。调试是作为成功测试的后过而出现的步骤&#xff0c;也就是&#xff0c;调试是在测试发现错误之后排除错误的过程。软件调试的任务是诊断和改成程序中的错误。 2&#xff0c;深度等于控制的层数 3&#x…

Linux基础(用户身份和文件权限)

用户身份与能力 Linux是一个多用户、多任务的操作系统&#xff0c;具有很好的稳定性与安全性&#xff0c;在幕后保障Linux系统安全则是一系列复杂的配置工作。 Linux系统的管理员之所以是root&#xff0c;并不是因为它的名字叫root&#xff0c;而是因为该用户的身份号码即UID…

TensorFlow实验(1)

实验1-2 搭建深度学习开发环境 1&#xff09;安装Anaconda 2&#xff09;创建虚拟环境&#xff1a; 3&#xff09;激活环境 4&#xff09;安装tensorflow 5)安装jupyter notebook 安装完成之后&#xff0c;运行第一个程序“Hello,World” 要求&#xff1a;详细安装步骤&…

TensorFlow实验(2)

实验3-4 数据结构-张量 1&#xff09;已知两个张量[1,3,5,7]和[2,4,4,8],编写一个模型&#xff0c;计算两个张量的加法&#xff0c;输出结果&#xff0c;并在tensorboard中显示 2&#xff09;已知张量[1,2,3,4,5,6,7,8,9,10,11,12]有12个元素&#xff0c;利用tf.reshape()将其…

Linux基础(文件权限续篇)

文件的特殊权限 在复杂多变的生产环境中&#xff0c;单纯设置文件的rwx权限无法满足我们对安全和灵活性的需求&#xff0c;因此便有了SUID,SGID,SBIT的特殊权限位。这是一种对文件权限进行设置的特殊功能&#xff0c;可以与一般权限同时使用&#xff0c;以弥补一般权限不能实现…

Linux基础(存储结构和磁盘划分)

一切从“/”开始 在Linux系统中&#xff0c;目录、字符设备、块设备、套接字、打印机等都被抽象成了文件&#xff0c;一切皆为件 与windows操作系统不同&#xff0c;Linux系统内不存在C/D/E/F盘等&#xff0c;一切文件都是从根&#xff08;/&#xff09;目录开始的 Linux系统…

软件工程(需求分析)

需求分析 为了开发出真正满足用户需求的软件产品&#xff0c;首先必须知道用户的需求。对软件需求的深人理解是软件开发工作获得成功的前提条件&#xff0c;不论人们把设计和编码工作做得如何出色,不能真正满足用户需求的程序只会令用户失望.给开发者带来烦恼。 需求分析是软…

TensorFlow构建二维数据拟合模型(1)

知识图谱 TensorFlow运行机制 TensorFlow是基于计算图的深度学习编程模型 Tensor表示张量&#xff0c;其实质上是某种类型的多维数组 Flow表示基于数据流图的计算&#xff0c;实质上是张量在不同节点间的转化过程。 在TensorFlow中&#xff0c;计算图中的节点称为OP&…

Qt图形界面编程入门(标签与槽机制习题分享)

标签对象初始显示0&#xff0c;每次单击标签对象后&#xff0c;其显示内容就加1&#xff0c;依次变为1、2、3等。 #ifndef DIALOG_H #define DIALOG_H#include <QDialog> #include <QPushButton> //包含命令按钮类 #include "MyLabel.h"class Dialo…

js中执行到一个if就停止的代码_Node 中如何引入一个模块及其细节

在 node 环境中&#xff0c;有两个内置的全局变量无需引入即可直接使用&#xff0c;并且无处不见&#xff0c;它们构成了 nodejs 的模块体系: module 与 require。以下是一个简单的示例const fs require(fs)const add (x, y) > x ymodule.exports add虽然它们在平常使用…

二级MS Office公共基础知识错题本(1)

1&#xff0c;顺序程序具有顺序性、封闭性和可再现性的特点&#xff0c;不具备并发性 2&#xff0c;为了降低算法的空间复杂度&#xff0c;主要应减少输入数据所占的存储空间以及额外空间&#xff0c;通常采用压编存储技术。 3&#xff0c;树的总的结点数为树中所有结点的度数…

c++ file* 句柄泄漏_C++核心指南:P.8 勿泄漏任务资源

P.8: 勿泄漏任务资源原因随着时间的推移&#xff0c;即使是资源的缓慢增长也会耗尽这些资源的可用性&#xff0c;这对于长时间运行的程序特别重要&#xff0c;但也是负责任的编程行为的基本部分。糟糕的例子void f(char* name){ FILE* input fopen(name, "r"); // .…

数据规范化、实体-联系图、状态转换图、层次方框图、Warnier图、IPO图及验证软件需求

数据规范化 软件系统经常使用各种长期保存的信息&#xff0c;这些信息通常以一定方式组织并存储在数据库或文件中&#xff0c;为减少数据冗余&#xff0c;避免出现插入异常或删除异常&#xff0c;简化修改数据的过程,通常需要把数据结构规范化。 通常用“范式(normal forms)”…

Linux基础(iptables与firewalld防火墙)

iptables 在早期的Linux系统中&#xff0c;默认使用的是iptables防火墙管理服务来配置防火墙。尽管新型的fierwalld防火墙管理服务已经被投入使用多年&#xff0c;但是大量的企业在生产环境中依然出于各种原因而继续使用iptables。 策略与规则链 防火墙会从上至下的顺序来读…

虚拟跳线软件干什么用的_疯狂刷单!用违法软件生成虚拟手机号,“骑手”半年“刷单”牟利60余万,百米内竟有万笔订单 | 申晨间...

来源&#xff1a;新闻晨报 记者&#xff1a;吴艺璇借助违法软件生成虚拟手机号码&#xff0c;利用平台审核漏洞大量注册用户&#xff0c;大量“刷单”骗取平台的返现和购物补贴&#xff0c;半年内疯狂刷1.8万余单&#xff0c;累计牟利60余万元。近日&#xff0c;在市公安局刑侦…

ygo游戏王卡组_ACG大科普(7)游戏王

大家是否在小时候接触过一种卡片类似这种的 这就是今天的主角游戏王。 背景 1996年&#xff0c;《游戏王》漫画开始在集英社《周刊少年Jump》连载。 1998年&#xff0c;Bandai推出以《游戏王》原作中登场的集换卡牌游戏“M&W”为题材的集换卡牌。 采用Bandai的卡片自动贩卖…

Qt图形界面编程入门(基本窗口及控件)

基本窗口类QWidget QWidget是所有窗体部件的基类&#xff0c;例如对话框类&#xff0c;主窗体类&#xff0c;以及其他诸如按钮&#xff0c;编辑框&#xff0c;标签等等都是由QWidget派生得到&#xff0c;QWidget拥有的方法往往都可以在其他子类中使用。 窗体的几何尺寸分为包…

背景se_盘点那些RPG手游中主角的背景故事,越悲情越强大

RPG游戏一直以代入感超强的游戏方式来吸引玩家&#xff0c;用超越现实的艺术手段把玩家带入到虚拟的游戏世界&#xff0c;让玩家担任不同的社会角色来去经历不同的虚拟故事&#xff0c;体验多种人生经历&#xff0c;想要扮演任何角色都是有可能的。当然在RPG游戏中也有好坏之分…

TensorFlow构建二维数据拟合模型(2)

变量的定义和使用 变量的定义与初始化 TensorFlow中&#xff0c;变量是一种特殊的张量&#xff0c;其值可以是一个任意类型的形状的张量。 与其他张量不同&#xff0c;变量存在于单个回话调用的上下文之外&#xff0c;主要作用是保存和更新模型中的参数。 声明变量通常使用…

c++用牛顿法开多次根_望远镜的历史之三:大神出世,改变望远镜历史的竟然是牛顿...

上次我们说到格里高利望远镜有点画蛇添足&#xff0c;那么格里高利望远镜添了什么呢&#xff1f;格里高利望远镜格里高利望远镜观测的图像都是正立的&#xff0c;这就意味着要采用多个凹面反射镜&#xff0c;而当时凹面反射镜磨制不易&#xff0c;无论是多大的科学家都要亲自动…