QT 信号和槽

2023-11-10

  信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性。要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler)的 QT 工具,该工具是一个 C++ 预处理程序,它为高层次的事件处理自动生成所需要的附加代码。 信号和槽能携带任意数量和任意类型的参数。我们可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接当这个信号被发射时,这些槽将会一个接一个地 执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。)甚至于将一个信号与另外一个信号相连接,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。

信号(Signals)

信号只需要在头文件中做声明,不需要在cpp中实现。放在QT自定义关键字signals下,在此之前一定要加上Q_OBJECT宏!

在编程中,一般使用的是控件内部定义好的信号。如:QTreeWidget类下的 Signals:

void	currentItemChanged ( QTreeWidgetItem * current, QTreeWidgetItem * previous )
void	itemActivated ( QTreeWidgetItem * item, int column )
void	itemChanged ( QTreeWidgetItem * item, int column )
void	itemClicked ( QTreeWidgetItem * item, int column )
void	itemCollapsed ( QTreeWidgetItem * item )
void	itemDoubleClicked ( QTreeWidgetItem * item, int column )
void	itemEntered ( QTreeWidgetItem * item, int column )
void	itemExpanded ( QTreeWidgetItem * item )
void	itemPressed ( QTreeWidgetItem * item, int column )
void	itemSelectionChanged ()

也可以自定义信号,并通过emit在代码中发射信号。

// ------------ sender.h -----------
class sender : public QObject
{
    Q_OBJECT
    public:
        void doSend();
    signals:
        void send(int);
};
// ------------ sender.cpp -----------
#include "sender.h"
void sender :: doSend()
{
    emit send(40);
}

槽(Slots)

  槽和普通的C++成员函数几乎是一样的(可以是虚函数,可以被重载,可以是public slots、protected slots、private slots,可以被其他C++成员函数直接调用;唯一不同的是:槽还可以和信号连接在一起,在这种情况下,信号被发射时,会自动调用这个槽。槽不需要信号传过来的参数时,可以不要参数;但槽一旦要参数,其参数个数,类型,顺序必须要和对应的信号保持一致。另外,槽的参数不能有缺省值。

// ------------ receiver.h -----------
class receiver : public QObject
{
    Q_OBJECT

    public slots:
        void recv(int);
};
// ------------ Receiver.cpp -----------
void receiver :: recv(int n)
{
    qDebug()<<"recv number: "<<n<<endl;
}

++++   ++++

关联信号和槽(connect)

可以使用QObject类的静态成员函数connect来建立信号的槽的关联

 bool QObject::connect (const QObject * sender, const char * signal, const QObject * receiver, const char * slot) [static]

具体的调用为:connect(sender, SIGNAL(signal), receiver, SLOT(slot));   其中sender和receiver为QObject类对象的指针; SIGNAL宏和SLOT宏将信号的槽转换成字符串。

sender s;
receiver r;
QObject::connect(&s, SIGNAL(send(int)), &r, SLOT(recv(int)));

注:在connect函数中信号函数和槽函数若有参数,只能写出参数类型,而不能也将变量名写出;否则,连接会失败!

断开信号和槽(disconnect)

当信号和槽没有必要继续保持连接时,可以通过调用disconnect来断开它们。

bool QObject::disconnect (const QObject * sender, const char * signal,  const Object * receiver, const char * slot) [static]

有三种情况必须使用 disconnect() 函数:

(1)断开与某个对象相关联的任何对象。

disconnect(sender, 0, 0, 0) ;
//或者
sender->disconnect();

(2)断开与某个特定信号的任何关联。

disconnect(sender, SIGNAL(signal()), 0, 0);
//或者
sender->disconnect(SIGNAL(signal()));

(3)断开两个对象之间的关联。

disconnect(sender, 0, receiver, 0);
//或者
sender->disconnect(receiver);

更多的请参考:http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html

转载于:https://www.cnblogs.com/kekec/archive/2011/07/20/2112054.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT 信号和槽 的相关文章

  • 每天都在谈SOA和微服务,但你真的理解什么是服务吗?

    近几年来 我一直从事着和面向服务相关的底层软件研发工作 逐渐的形成了一些自己的看法 其中我觉得比较重要的看法就是服务需要一个更准确细致的定义 简单来说 服务的本质就是行为 业务活动 的抽象 为了更好的阐述新服务的概念 并方便与传统的SOA中
  • SQL 查询指定行数的数据。

    今天遇到一个关于 查询指定行数的数据 的sql查询语句问题 突然发现以前没怎么接触过 刚才想起来了 赶紧看了下文档 又上网搜了下 有了下面的东西 不知道有没有什么地方不对 oracle 先看一下文档中关于any和all的例子 很不错噢 An
  • 多线程系列之——事件内核对象

    所有内核对象里面事件内核对象是最简单的一个 它包括一个使用计数 还有两个布尔值 一个布尔值用来表示事件是手动重置事件还是自动重置事件 另一个布尔值表示当前是否处于触发状态 当一个手动重置事件被触发的时候 所有等待该事件的线程都能变成调度状态
  • 编写程序模拟完成动态分区存储管理方式的内存分配和回收。

    usr bin python coding utf 8 class Table object 空闲分区表 0 开始地址 1 长度 freeTable 占用分区表 0 程序名 1 开始地址 2 长度 useTable def init sel
  • JNA模拟复杂的C类型——Java映射char*、int*、float*、double*

    文章目录 引言 Java Native Type Conversions Java和C基本类型指针对应关系 Pointer的具体用法 引言 最近项目在用Java调用C写的一些三方库 没办法直接调 用Java封装一下C的接口 这就少不了要用到
  • typedef struct 用法详解

    typedef为C语言的关键字 作用是为一种数据类型定义一个新名字 当typedef与结构结合使用时 会有一些比较复杂的情况 而且在C语言和C 里面有略有差别 本文将详细讲解typedef struct的用法 第一篇 typedef str
  • C/C++中浮点数格式学习——以IEEE75432位单精度为例

    这是浮点数的通常表示形式 在IEEE754中 单精度浮点数有如下形式 32位单精度 单精度二进制小数 使用32个比特存储 1 8 23位长 S Exp Fraction 31 30至23偏正值 实际的指数大小 127 22至0位编号 从右边
  • 互联网创业盈利模式指南

    看了很多创业的case 都有点下笔千言 离题万里的 情况 就是很多case都很精彩 但是公司 的价值最终是落实到 给创业者和投资人的回报的 因此 所有的case 最终都是 落实到盈利 模式上 一位投资人士说的很明确 中国的盈利模式很简单 就
  • BP学习算法-构建三层神经网络

    引 人工神经网络 Artificial Neural Networks 简写为ANNs 也简称为神经网络 NNs 或称作连接模型 Connection Model 是一种模仿动物神经网络行为特征 进行分布式并行信息处理的算法数学模型 这种网
  • 为何在新建STM工程中全局声明两个宏

    在uVision中新建STM32工程后 需要从STM32标准库中拷贝标准外设驱动到自己的工程目录中 此时需要在工程设置 gt C C 选项卡下的Define文本框中键入这两个全局宏定义 STM32F40 41xxx USE STDPERIP
  • lua和测试(一)

    lua做为一门高级语言 在游戏产业运用到机会越来越多了 测试掌握几门脚本语言也有一定的重要性 以下对于lua组合输入做出一些引导 测试需要掌握的关于返回数值 主要用到布尔类 前言的指引 lua的语法比较简单和清晰 学过c语言的可以很好的掌握
  • 模板的完全特例化和部分特例化

    介绍 完全特例化就是类型完全明确的版本 而部分特例化指的是 只知道是几个参数的函数而不知道参数的类型 或者是只知道是引用或者是指针类型 而不知道具体是char 还是 int 模板特例化实例1 template
  • Dev-C++之开启装逼效果

    Dev C 是个不错的C IDE 在10年前 它是很不错 在现在 它是个以界面丑陋和调试像吃粑粑这两点著称 如下图 实在是丑到离谱 丑到无法忍受 可是没办法呀 人家CCF规定比赛用这个 你个小蒟蒻吵什么 我现在就来讲讲怎么把你的Dev C
  • mfc窗口创建的create与oncreate

    在view类中 create 是虚函数由框架调用 是用来 生成一个窗口的子窗口 oncreate 消息响应函数 是用来 表示一个窗口正在生成 某个CWnd的Create函数由当前CWnd的Owner调用 而在CWnd Create中 又会调
  • 手把手教你如何写一个三子棋/N子棋的小游戏

    这里写目录标题 第一步 游戏进入界面 第二步 初始化棋盘 第三步 打印棋盘 第四步 玩家和电脑下棋 第五步 判断输赢 三子棋或者N子棋怎么写 让我们先来玩一把 再来看看怎么写 程序运行界面 1为玩游戏 2为清屏 0为退出游戏 我们选1 然后
  • Public Private Protect Inheritance and access specifiers

    In the previous lessons on inheritance we ve been making all of our data members public in order to simplify the example
  • 【C/C++】 - Linux下查找函数头文件 以及 man命令拓展

    背景 比如现在需要找C语言 sleep函数的头文件 使用man来查找 可以先man sleep 可以发现出来的默认是sleep 1 是一个User Commands 明显不是我们需要的 这里提示了 看sleep 3 那我们查看下sleep
  • Open3D(C++)实现建筑物点云立面和平面分割提取

    Open3D C 实现建筑物点云立面和平面分割提取 近年来 点云技术在城市规划 机器人地图构建等领域得到广泛应用 本篇文章将介绍如何利用Open3D C 库实现建筑物点云立面和平面分割提取 准备工作 首先需要编译安装Open3D库 本文使用
  • C/C++编程中的算法实现技巧与案例分析

    C C 编程语言因其高效 灵活和底层的特性 被广大开发者用于实现各种复杂算法 本文将通过10个具体的算法案例 详细探讨C C 在算法实现中的技巧和应用 一 冒泡排序 Bubble Sort 冒泡排序 Bubble Sort 是一种简单的排序
  • C++ 字符串比较------strcmp函数和strncmp函数

    strcmp 函数原型 int strcmp const char str1 const char str2 功能 strcmp函数会按照字典顺序逐个比较两个字符串的字符 直到遇到不同的字符或者遇到字符串结束符 0 返回值 该函数返回值如下

随机推荐

  • flask 框架

    Flask本身只是建立了一个Web框架 很多功能都需要在Flask基础上进行扩展 如果是高手 可以手打一个Flask Extension 普通人可以用已经开源扩展进行二次开发 用过的几个Flask的扩展库 目前为止Flask Securit
  • 【C++】Windows系统&Linux系统获取uuid统一通用代码

    ConsoleApplication1 cpp 定义控制台应用程序的入口点 include stdafx h include
  • Qt进程间通信

    简述 进程间通信 就是在不同进程之间传播或交换信息 通信方式 管道 pipe 管道是一种半双工的通信方式 数据只能单向流动 而且只能在具有亲缘关系的进程间使用 进程的亲缘关系通常是指父子进程关系 有名管道 named pipe 有名管道也是
  • java中访问修饰符的权限

    在java中 最常见的访问修饰符有以下四个 public default 默认 即不写修饰符 protected private 它们主要用来规定所修饰成员的开放程度 用来保护成员不被随意调用和修改 在新建一个类时 只能用public和de
  • 【区块链】深度长文:2018新风口,区块链3.0时代即将来临?

    徐小平说 区块链将掀起一场革命 1月9日 徐小平在真格投资组合群里分享了一段关于拥抱区块链时代的内容 并表示不能外传 被泄露的微信截图 岂料 很快去传了出去 他表示 这本是其与被投公司间的 低调 内容分享 现在被人擅自传出去 也没办法 最后
  • Express基本认识

    express是一个基于nodejs 且快速 开放的一个web开发框架 安装命令 yarn add express 查看express的所有版本 npm view express versions 搭建基本的express程序 const
  • ./configure --prefix=

    一直用这个选项prefix 但不知道 啥意思 转载自 inux安装软件采用源码安装灵活自由 适用于不同的平台 维护也十分方便 源码的安装一般由3个步骤组成 配置 configure 编译 make 安装 make install 具体的安装
  • centos7设置开机为命令行启动

    图形界面默认安装之后 每次启动都是图形界面启动 图形界面需要占用系统大量的内存和CPU资源 对于个人电脑和服务器 将Centos 默认启动改为文本方式 会显著提高运行效率 方法一 不修改默认启动方式 root模式下 init 3 gt 切换
  • sqlserver查看执行计划

    方式一 通过Microsoft sql server management studio工具栏中的 显示估计的执行计划 按钮 选中SQL 然后点击该按钮 SQL就会给我们选中SQL的图形执行计划 方式二 set showplan all o
  • 【无监督学习】0、有监督学习、无监督学习、半监督学习

    文章目录 一 有监督学习 二 半监督学习 三 无监督学习 3 1 对比式学习 一 有监督学习 有监督学习最大的特点就是数据集是带标签的 如有监督分类任务 就是给每张图都分配一个真实标签 表示这张图是 dog cat 或者是 bird 而标签
  • 【iOS】内存管理

    文章目录 前言 理解引用计数 引用计数原理 属性存取方法中的内存管理 自动释放池 保留环 以ARC简化引用计数 使用ARC时必须遵守的命名规则 变量的内存管理语义 ARC如何清理实例变量 覆写内存管理的方法 在dealloc方法中只释放应用
  • Lua 15分钟快速上手(上)

    本系列相关文章 Flutter 热更新及动态UI生成 Lua 15分钟快速上手 上 Lua 15分钟快速上手 下 Lua与C语言的互相调用 LuaDardo中Dart与Lua的相互调用 在之前的博客 Flutter 热更新及动态UI生成 一
  • 【python环境搭建】conda 安装过程中无法激活 python 虚拟环境问题

    目录 1 概要 2 解决办法 1 概要 最近重新学习python 需要搭建conda 环境 遇到一个懵逼的问题 C Users 67656 gt conda activate Date CommandNotFoundError Your s
  • Unity API Camera摄像机的使用

    Camera main 返回主摄像机的Camera组件 第一个启用的标签为 MainCamera 的摄像机 只读 场景中的主要摄像机 如果场景中没有这样的摄像机 则返回null 此属性在内部使用FindGameObjectsWithTag
  • 合宙Air724UG LuatOS-Air LVGL API控件--按钮 (Button)

    按钮 Button 按钮控件 这个就不用多说了 界面的基础控件之一 示例代码 按键回调函数 event handler function obj event if event lvgl EVENT CLICKED then print Cl
  • 执行Shell脚本的4种方法

    假设我们编写好的shell脚本的文件名为hello sh 文件位置在 root bin目录中并已有执行权限 添加权限的方法 chmod x hello sh 1 方法一 切换到shell脚本所在的目录 此时 称为工作目录 执行shell脚本
  • anaconda代码

    因为老是不记得代码 要找来找去的 索性自己写一下怕忘记 windos conda info envs 查看本机所有的虚拟环境 conda remove n 你自己的环境的名字 all 删除虚拟环境 conda create n 自己想取的名
  • linux网络服务network没了,Linux网络服务(network service)管理

    Linux操作系统中重新启动网络的方法 网页链接 https ywnz com linux 4463 html 1 网络管理员服务 这是使用命令行重新启动网络的最简单方法 它等同于图形化方式 重新启动Network Manager服务 su
  • Unity2D修改Sprite颜色和透明度

    Unity2D修改Sprite颜色和透明度 简单注意原理在前边 后面是实现方法 首先创建一个Sprite 最好选择纯白色的Sprite 选择的图片需要是白色的才会在修改颜色后有明显的显示 因为颜色修改后 它的最终显示是本来的图片的颜色与修改
  • QT 信号和槽

    信号和槽是一种高级接口 应用于对象之间的通信 它是 QT 的核心特性 要正确的处理信号和槽 必须借助一个称为 moc Meta Object Compiler 的 QT 工具 该工具是一个 C 预处理程序 它为高层次的事件处理自动生成所需要