(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 信号与槽 的相关文章

  • 更改 WinForms 按钮突出显示颜色

    I found 这一页 https stackoverflow com questions 9260303 how to change menu hover color winforms 其中概述了如何更改 MenuStrip 及其项目的呈
  • cx_freeze:QODBC 驱动程序未加载

    我的 python 应用程序如下所示 test py from PyQt4 import QtCore from PyQt4 import QtGui from PyQt4 import QtSql import sys import at
  • for 和 while 循环中没有循环条件

    while cond fine for cond fine 但是当我删除条件部分时 while syntax compilation error for Infinite loop 这些循环内部是如何实现的 或者 编译器 解析器 如何知道中
  • 验证码怎么写?

    我正在开发一个注册表 我想放置验证码 我生成一个随机字符串 但如何将其转换为图像 否则我如何开发验证码或任何参考 谢谢 Try out 验证码 http recaptcha net plugins aspnet 或查看博客文章 使用 Asp
  • c++1y 模式下的 Clang >= 3.3 无法解析 标头

    我有一个项目可以在 g 4 8 1 和 c 11 模式下 clang gt 3 3 下正确编译和运行 然而 当我切换到实验时 std c 1y模式下 clang 3 3 但不是 g 在
  • 如何将文本框中删除的字符替换为0

    在winforms中 如何用零替换删除的字符 例如 文本框中为 12 45 如果我们删除小数点后 它应该变成12 00 同样的方法删除前面的000 45 默认值应为 000 00 Use a 蒙版文本框 http msdn microsof
  • ReportViewer“缺少 URL 参数:名称”

    在一个网络应用程序中 我正在处理 ReportViewer 时不断出现错误 缺少 URL 参数 名称 我找到了原因 但没有找到解决方案 导致报告查看器出现异常的 url Reserved ReportViewerWebControl axd
  • 如何获得字符串的所有字谜

    我试图找到一个字符串的所有可能的字谜并仅使用递归将它们存储在数组中 我被困住了 这就是我所拥有的一切 int main const int MAX 10 string a ABCD string arr 10 permute arr a 0
  • 最好的 C++ 编译器是哪个? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何存储将被多个不同类访问的字符串常量? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 关于堆栈溢出有太多不同的答案 声明一个命名空间 并在 hpp 文件中将所有字符串标记为 extern const 并在 cpp 文件中放置它们的
  • 如果键不是映射中的初始化键,STL map[key] 返回什么? [复制]

    这个问题在这里已经有答案了 这是一些示例代码 include
  • STL(标准模板库)中使用的设计模式

    我正在学习STL和设计模式 我想知道是否有任何文档或链接可以解释如何在 STL 中实现设计模式 我做了谷歌但无法获得太多数据 我希望你的意思是 哪些设计模式可以在STL中识别 STL 堆栈是一个容器适配器 适配器是一种设计模式 迭代器也是一
  • 让 AutoMapper 自动映射前缀属性

    我希望 AutoMapper 自动映射成员 如下所示 class Model public int ModelId get set class ModelDto public int Id get set 在这里 我会做一个 CreateM
  • 如何使用 Xamarin 应用程序开发自动注销

    我必须在 App xaml cs 上添加功能才能使其正常工作 我在 OnStart 上添加了功能 但现在它会间歇性地一次又一次地将我从应用程序中注销 根据下面的代码 我需要做什么才能让它停止这样做 或者我的代码有问题 这是我最新的代码 na
  • 当数据源中只有 1 项时 FormView 不显示 PagerTemplate

    我有一个带有自定义 PagerTemplate 的 FormView 控件和我自己的分页 LinkBut ton 一切都很好 直到我加载的数据集仅包含一个记录 项目并完全隐藏 PagerTemplate 我在网上搜索了一下 找到了几个答案
  • 为什么 `boost::any` 比 `void*` 更好?

    有什么先天优势boost any and boost any cast提供超过使用void and dynamic cast 优点是boost any比类型安全得多void E g int i 5 void p i static cast
  • 如何在 C# 中读取 Visio 文档内容

    我的DLL库代码如下 using System using IVisio Microsoft Office Interop Visio namespace Emix public class Visio protected String p
  • 使用 JSON.NET 反序列化一些 JSON

    我对 JSON 非常陌生 我需要解析 API 提供的一些内容 谷歌快速搜索出现了JSON NET http james newtonking com pages json net aspx 所以我现在尝试使用它将此 JSON 解析为列表对象
  • scanf() 不等待用户输入[重复]

    这个问题在这里已经有答案了 我正在使用 c 中的双向链表来制作树 我在该函数中使用递归调用 但不知何故它不起作用 我的代码是 struct node int data struct node right struct node left s
  • 如何包装实体框架以在执行前拦截 LINQ 表达式?

    我想在执行之前重写 LINQ 表达式的某些部分 我在将重写器注入正确的位置时遇到问题 实际上根本没有 查看实体框架源代码 在反射器中 它最终归结为IQueryProvider Execute在 EF 中 它通过以下方式耦合到表达式Objec

随机推荐

  • 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