(2021-8-16) QT5 信号与槽

2023-11-17

1. 概念

**信号(Signal)**就是在特定情况下被发射的事件,如点击按钮会发送 click()事件。
**槽(Slot)**就是对信号响应的函数。槽就是一个函数,与一般的 C++函数是一样的,可以
定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

2. 使用

信号与槽使用 QObject::connect() 函数进行关联:

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

其中,sender 是发射信号的对象的名称,signal() 是信号名称。信号可以看做是特殊的函
数,需要带括号,有参数时还需要指明参数。receiver 是接收信号的对象名称,slot() 是槽函数的名称,需要带括号,有参数时还需要指明参数。

断开信号关联使用 disconnect()。

bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, constchar *method)

如:
断开一切与 myObject 连接的信号或槽。
disconnect(myObject, 0, 0, 0);
相当于非静态重载函数:
myObject->disconnect();
断开所有连接到特定信号的东西。
disconnect(myObject, SIGNAL(mySignal()), 0, 0);
相当于非静态重载函数:
myObject->disconnect(SIGNAL(mySignal()));
与指定的接收者断开连接。
disconnect(myObject, 0, myReceiver, 0);
相当于非静态重载函数:
myObject->disconnect(myReceiver);

3. 注意事项

  • 一个信号可以连接多个槽。
connect(pushButton, SIGNAL(clicked()), this, SLOT(hide());
connect(pushButton, SIGNAL(clicked()), this, SLOT(close());

当一个信号与多个槽函数关联时,槽函数按照建立连接时的顺序依次执行

  • 当信号和槽函数带有参数时,在 connect()函数里,要写明参数的类型,但可以不写参数名称。
  • 多个信号可以连接同一个槽。
connect(pushButton,SIGNAL(clicked()),this,SLOT(close()));
connect(pushButton_2,SIGNAL(clicked()),this,SLOT(close()));
connect(pushButton_3,SIGNAL(clicked()),this,SLOT(close()));
  • 一个信号可以连接另外一个信号。
connect(pushButton,SIGNAL(objectNameChanged(QString)),this,SIGNAL(windowTitelChanged(QString)));

严格的情况下,信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽的参数。如果不匹配,会出现编译错误或运行错误。

  • 在使用信号与槽的类中,必须在类的定义中加入宏 Q_OBJECT(特别重要)。
  • 信号只需声明,无需定义。
  • 槽可以是任何成员函数、普通全局函数、静态函数。
  • 槽函数和信号的参数和返回值要一致。

4. 测试例程

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
signals:
    /* 声明一个信号,只需声明,无需定义 */
    void pushButtonTextChanged();

public slots:
    /* 声明一个槽函数 */
    void changeButtonText();

    /* 声明按钮点击的槽函数 */
    void pushButtonClicked();

private:
    QPushButton *pushButton;

};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->resize(800,480);
    pushButton = new QPushButton(this);
    pushButton->setText("我是一个按钮");

    connect(pushButton,SIGNAL(clicked()),this,SLOT(pushButtonClicked()));
    connect(this,SIGNAL(pushButtonTextChanged()),this,SLOT(changeButtonText()));
}

MainWindow::~MainWindow()
{
}

/* 实现按钮点击槽函数 */
void MainWindow::pushButtonClicked()
{
    emit pushButtonTextChanged();
}

/* 实现按钮文本改变的槽函数 */
void MainWindow::changeButtonText()
{
    /* 在槽函数里改变按钮的文本 */
    pushButton->setText(" 被点击了!");
}

运行效果:
在这里插入图片描述在这里插入图片描述

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

(2021-8-16) QT5 信号与槽 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • clickhouse导入数据 DBeaver大坑

    测试数据有一亿条需要导入数据库 使用DBeaver自带导入数据功能 结果放置一晚才导入一千万条 估计导入设置有问题 于是寻找合适方式 记录如下 首先将待导入的csv数据表45G 传输到clickhouse所在的服务器 在数据库中提前建好表
  • 魔方机器人之硬件篇

    待续 点击打开链接 思睿硬件设计博客
  • 面向组织分析的内容

    声明 本文是学习GB T 42859 2023 航天产品质量问题三个面向分析方法实施要求 而整理的学习笔记 分享出来希望更多人受益 如果存在侵权请及时联系我们 1 范围 本文件规定了航天产品质量问题三个面向分析方法实施的一般要求 程序和分析
  • 进制转换(C++)

    文章目录 一 任意2 36进制数转换为10进制数 1 1 c 代码实现 二 十进制转换为其他进制 2 1 方法一 2 2 c 代码实现 2 3 方法二 2 4 Demo 一 任意2 36进制数转换为10进制数 以二进制转换为十进制为例 基本
  • Vue2 vue-cropper裁剪图片-使用方法及注意事项

    记录vue croppe的使用及过程中遇到的问题 参考文章 Vue2中使用vue croper插件实现图片上传裁剪 超详细 效果图 安装 npm install vue cropper 或 yarn add vue cropper 封装vu
  • Linux之gdb的使用

    当我们能够在windows下 使用vs 2019等编译器去进行调试的时候 我们可以将在Linux下使用gdb调试这两者之间进行对比 调试这个操作 在方法上有区别吗 Linux和windows 其实 在调试思路上是一样的 在调试的操作方式上一
  • 超详细的移动Web知识树状图(flex、移动适配、响应式)

    前言 学习任何新知识 最重要的永远都是搭建属于自己的知识框架 随后学习的细碎知识点往框架里面填入 最后形成一棵属于自己的知识大树 本系列的博客专注更新总结好的思维导图 希望可以帮助大家快速理清知识结构 注意 本系列文章是拿来建立知识体系 没
  • 基于51单片机的热水器设计

    概述 本实例是基于51单片机的智能热水器控制系统 主要硬件由51单片机最小系统 LCD1602显示屏屏电路 水位传感器电路 ADC转换电路 DS18B20数字温度传感器 蜂鸣器报警电路 按键电路 加水继电器电路 加热继电器电路电路构成 功能
  • IPv6 ‘dadfailed‘异常问题:重复地址检测【已解决】

    ipv6地址显示异常 inet6 x x x x 1 64 scope global tentative dadfailed 无法使用命令ping6 这个地址 原因是当另一台主机关闭 但ipv6地址未被删除 并且新主机无法使用此地址时 为防
  • Kali开启ssh服务

    Kali开启ssh 尝试Powershell连接ssh服务 输入密码 发现被拒绝 ssh root kali的ip 一般出现这个问题大概率可能是ssh服务没有开启 开启一下即可 注 密码错误也会报该错误提示 这里是正确密码的情况下 第一步
  • 将网站打包成桌面程序并生成安装包(跨平台)

    一 Nativefier将网站打包成桌面程序 介绍 Nativefier 是一个命令行工具 仅仅通过一行代码就可以轻松地为任何的网站创建桌面应用程序 应用程序通过 Electron打包成系统可执行文件 app exe等 对应的可执行文件分别
  • spring mvc oracle 配制,Springmvc+mybatis配置动态切换数据源 并实现mybatis同时支持mysql和oracle数据库...

    注意 配置切换数据源和实现mybatis支持多种数据库为独立的配置 二者不相干 一 实现mybatis支持多种数据库 这里配置扫描不需要区分 扫描全部即可 classpath com mapper xml oracle mysql myba
  • 邮箱发送html php源码,php发送邮件函数,支持html和普通文本

    eol headers Reply To namefrom eol headers Return Path namefrom eol these two to set reply address headers Message ID eol
  • 分享一百多套开发视频教程的下载地址

    原文地址 http www cnblogs com dennisit p 3184225 html 北京圣思Java培训教学视频 资源共享网 2 Lucene WebService SVN Ant SpringMVC视频 学习资料库网 3
  • CMake入门教程:configure_file构建配置编程

    CMake入门教程 configure file构建配置编程 在进行软件开发过程中 配置文件的生成和管理是一个重要且常见的任务 为了简化这一过程 CMake提供了configure file函数 它可以帮助我们在构建过程中动态生成配置文件
  • Python----Python调用C语言方法

    原文链接 1 为什么要使用Python调用C语言 可以将一些耗时的操作的函数使用C语言编写 然后主题代码是python 这样使用python去调用C语言 就可以做既能有python语言的简单性 有可以利用C语言的高性能 从而达到整体既简单又
  • 萌梦聊天室16.9.23.77更新

    App名称 萌梦聊天室 App格式 apk 安卓适用 测试机型Android 4 4 红米2 exe Windows 10 App大小 18 2MB Android 27 7MB Windows 10 更新履历 1 修正Android等移动
  • pcre c语言,pcre函数详细解析

    PCRE是一个NFA正则引擎 不然不能提供完全与Perl一致的正则语法功能 但它同时也实现了DFA 只是满足数学意义上的正则 1 pcre compile 原型 include pcre pcre compile const char pa
  • Windows 2012 DHCP超级作用域的一个坑

    今天在将Cisco交换机DHCP服务改为Windows2012服务器DHCP服务的过程中 发现一个奇怪的现象 环境 Cisco2960S交换机上划分有多个VLAN interface Vlan3 ipaddress 10 86 24 1 2
  • (2021-8-16) QT5 信号与槽

    1 概念 信号 Signal 就是在特定情况下被发射的事件 如点击按钮会发送 click 事件 槽 Slot 就是对信号响应的函数 槽就是一个函数 与一般的 C 函数是一样的 可以 定义在类的任何部分 public private 或 pr