从零开始学Qt(四)信号与槽

2023-11-06

信号与槽

                                                                                                  -----书不记,熟读可记;义不精,细思可精。

1、信号/槽是啥?

        古有“烽火狼烟”传递消息,敌人来犯的消息迅速传达开来,是多么的聪慧啊。烟就是信号;下一个燃火台看到烟后就点燃燃料,这个就槽。换种方法说就是 一个按钮被点击了,会触发一个点击的信号;槽是指收到信号之后,具体要去做什么。

        专业点说你可以从设计模式上理解,其实就是观察者模式。信号是“主题”,每个槽是“观察者”。当发出信号的时候,对该信号感兴趣的槽就会被触发(有没有觉得突然逼格变高了)。简单点说信号类似广播,每个槽都可以听到这个广播,但是只有你连接过的槽才会去接收这个信号,并作出相应的操作。

        信号和槽分为两种,一种是类自带的信号和槽,直接可以使用。另外一种是我们可以自定义信号和槽,使得我们更加的自由。当一个类被继承的时,该类的信号和槽也同时被继承。

2、怎么查看Qt中具体类的信号和槽

        有两种方法可以查看,第一种我们可以打开Qt Assistant(助手),还有一种是直接打开Qt Creator(里面也集成了上面那个模块),所以我们直接讲后者。跟着我的步骤,我们以查看QLabel为例子,如下图:



        点击上图的信号/槽,就会跳到具体的位置。



3、打开之前的HelloQt工程

        我们这篇的内容会围绕着这个例子来讲《从零开始学Qt(三)从Hello,Qt说起》。所以我们来打开之前的工程。并且介绍下,如何打开Qt工程。

        打开Qt有两种方法:

1)第一种是打开工程目录,然后双击 HelloQt.pro 文件,就可以直接打开该工程。

2)先打开Qt Creator,从文件->打开文件或项目,找到HelloQt工程,然后选中HelloQt.pro文件,然后点击打开。

4、自定义信号跟槽

        类声明中必须包含Q_OBJECT宏;信号跟槽都必须在头文件中定义。

        1)信号: 只要再.h中声明即可,发射信号用emit关键字。

        2)槽:实现的时候跟普通的成员函数一样实现即可。

5、格式

         connect(发送者,信号,接收者,槽);

        1)一个信号可以与另外一个信号相连

        connect(发送者,信号,接收者,信号);

        2)一个信号可以与多个槽相连

        connect(发送者1,信号1, 接收者1, 槽1);

        connect(发送者1, 信号1, 接收者2, 槽2);

        3)一个槽可以被多个信号关联。

        connect(发送者1,信号1, 接收者1, 槽1);

        connect(发送者2, 信号2, 接收者1, 槽1);

6、例子

        1)添加一个按钮,如图下图所示操作:

           


        2)Ctrl + S 保存

        3)点击回到编辑界面,如下图:


        3)在.h里面自定义槽函数,响应按钮按下的信号

                双击mainwindow.h;在编辑窗口看到mainwindow.h文件。如下图:


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:                   //所有的槽函数都必须申明public slots语句内
    void slt_clearLabel();      //这里定义一个槽函数,来实现清空文本框的内容

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

        4)实现槽函数

             上面也提到了,实现槽函数。跟实现普通的成员函数一样。

void MainWindow::slt_clearLabel()
{
    ui->label->clear();     //清空文本框内容
}

        5)绑定    

connect(ui->pushButton, SIGNAL(pressed()), this, SLOT(slt_clearLabel()));

        6)mainwindow.cpp文件的完整代码

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->pushButton, SIGNAL(pressed()), this, SLOT(slt_clearLabel()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::slt_clearLabel()
{
    ui->label->clear();     //清空文本框内容
} 

    7)运行结果

        点击按钮的时候,QLabel里面的文字会被清空。

7、Qt5中的新语法

        这里先简单介绍一部分。介绍是因为Qt5里面更新的语法,有些比较实用。为什么先介绍上面的,是因为旧版本对于新手比较好理解。

        1)先来一个比较。一个QSlider对象的valueChanged信号链接到一个QSpinBox对象的setValue槽,使用

传统方式:

connect(slider, SIGNAL(valueChanged(int)), spinbox, SLOT(setValue(int)));

使用新式语法格式:

connect(slider, &QSlider::valueChanged, spinbox, &QSpinBox::setValue);

        2)新语法的优点

  • 编译期:会检查信号和槽是否存在,且参数类型是否合法,如果错误将编译不通过。(旧版的如果参数不匹配只会有个Warning的信息,而编译可以通过)
  • 信号可以槽函数、普通函数、类的成员函数、lambda函数连接。(旧版的只能跟槽函数连接)
  • 允许一些自动类型转换,即信号和槽参数类型不必完全匹配。(旧版的一定要匹配,否则连接失败。槽函数无法响应)。例如:(旧版的会连接失败)
    connect(a, SIGNAL(sig(int)), b, SLOT(slt(double)));
  • 参数可以是typedef,如下:(旧版的会连接失败)
typedef int myInt;
connect(a, SIGNAL(sig(int)), b, SLOT(slt(myInt)));
8、作业

      你们可以试着,把例子里面的旧版连接,改成Qt5新语法的连接。(答案在下篇博客)


结束:

        最后有同学会遇到问题,可以加QQ群讨论。如果我哪里错了,也希望有人告知我,我来修改文章,以免误导他人。

    QQ群号:657609024

最后希望,如果有人转载文章,请标加上注明转载。

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

从零开始学Qt(四)信号与槽 的相关文章

  • spring boot配置tomcat部署(12.24修改)

    spring boot本身默认为jar包运行 可以改为war包 然后运行在tomcat里 具体修改的步骤如下 1 在pom xml文件里添加需要的依赖
  • Read keyboad input from background process

    https raspberrypi stackexchange com questions 55431 read keyboad input from background process TIPS For a new project I
  • 9、利用Maven的Source插件,对Maven工程的源码进行打jar包

    在很多情况下 需要对于Maven工程的源代码进行源文件的打包 可以利用source插件来完成 利用Maven的Source插件 对Maven工程的源码进行打jar包 1 新建一个Maven项目 如下 2 对于source插件的简介如下 1
  • freemarker教程

    FreeMarker语言 FreeMarker语言概述 FreeMarker是一个模板引擎 一个基于模板生成文本输出的通用工具 使用纯Java编写 FreeMarker被设计用来生成HTML Web页面 特别是基于MVC模式的应用程序 虽然
  • 高级计算机网络 知识点总结

    高级计算机网络知识点总结 一 引言 一 OSI七层模型 OSI定义了网络互连的七层框架 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 即ISO开放互连系统参考模型 每一层实现各自的功能和协议 并完成与相邻层的接口通信 OSI的
  • 5G及移动边缘计算(MEC)学习笔记(1)

    原文链接 https blog csdn net gongxifacai believe article details 80804841 1 1G 5G发展变革 1G 第一代移动通信系统出现在蜂窝系统理论提出之后 主要满足人们无线移动通话

随机推荐

  • GameFi 增长: 如果保持游戏用户的留存

    Mar 2023 Daniel 链游存在用户留存低的问题 对于所有关于成为游戏的未来的讨论 90 的区块链游戏在30天内就不活跃了 如果没有玩家长期享受游戏 今天大多数GameFi项目仍然只是DeFi协议 以及有更漂亮的图形和一些互动元素
  • idea 安装 Vue 插件后没有新建Vue文件Vue component选项

    解决办法 2 copy之后会出现一个新文件 Name 改成 Vue Component 然后把代码里的 COMPONENT 删掉即可
  • Android高斯模糊(毛玻璃效果)蒙层库

    ShapeBlurView ShapeBlurView库是一个高斯模糊 毛玻璃效果 蒙层库 Like iOS UIVisualEffectView不知大家做需求的时候是否有这样的效果要求 需求示例 大家熟悉的Android常用图片加载库 比
  • 剑指 Offer 62. 圆圈中最后剩下的数字(leetcode)--约瑟夫问题

    文章目录 题目描述 算法 约瑟夫问题 算法描述 解决方案 普通解法 缺点 公式法 代码 题目描述 算法 约瑟夫问题 算法描述 约瑟夫问题是个著名的问题 N个人围成一圈 第一个人从1开始报数 报M的将被杀掉 下一个人接着从1开始报 如此反复
  • 该连接被站点断开怎么办_上网速度慢、掉线怎么办

    又到周末啦 休息的小伙伴可以在家里看看视频 玩玩手机 打打王者 彪彪飞车 但是网络突然出现网速慢掉线 电视看不了 游戏玩不了 怎么办呢 还要追剧呢 还要打团呢 还要飙车呢 好难过 别着急 小助手来帮你 上网速度慢怎么办 1 访问某个站点服务
  • [需求管理-11]:需求拆分常见的原则与方法

    目录 前言 第1章 需求拆分的原则 1 1 理解需要背后的客户价值 1 2 参考 用户故事的定义方法 1 3 系统需求的层次 1 4 需求拆分的INVEST原则 小而整 1 5 需求拆分的三个准则 一个用户 完整价值 不依赖 第2章 9 种
  • unity打飞碟

    unity hw4 1 编写一个简单的鼠标打飞碟 Hit UFO 游戏 游戏的演示视频地址 http v youku com v show id XMzU0Mjg0NDg3Mg html spm a2h3j 8428770 3416059
  • Python初学 Anaconda安装方法

    Anaconda 指的是一个开源的Python发行版本 其包含了Python conda等180多个科学包及其依赖项 conda是一个开源的包 环境管理器 可以用于在同一个机器上安装不同版本的软件包及其依赖 并能够在不同的环境之间切换 因为
  • 下载blob地址或m3u8格式视频方法以及常见问题解决

    STEP1 在一些视频播放网站视频下方没有直接的下载按钮 此时可以先用电脑F12键查看元素 会出现类似如下界面 STEP2 该界面左上角的位置有一个指针形状的按钮 选用这个按钮 点一下网页里视频播放的区域 审查元素界面会跳转到类似如下的界面
  • Pandas知识点-合并操作join

    Pandas知识点 合并操作join 在Pandas中 join 方法也可以用于实现合并操作 本文介绍join 方法的具体用法 一 基础合并操作 join other 将一个或多个DataFrame加入到当前DataFrame中 实现合并的
  • Redis基础

    文章目录 1 Redis入门 Redis简介 Redis下载与安装 Redis启动与停止 设置Redis密码和允许远程连接 2 Redis数据类型 3 Redis常用命令 字符串string操作命令 哈希hash操作命令 列表list操作命
  • Windows防止程序多开并在多开时弹出已运行程序

    Windows下防止程序多开并在多开时弹出已运行的程序 1 功能说明 在Windows客户端开发时 往往需要禁止客户多开程序的情况 并且在客户再次双击启动图标时显示已启动的程序界面 故而需要下面的功能 使用CreateMutex禁止程序多开
  • CNN网络,CNN+SVM网络对故障分类(python代码)

    1 数据集可以使用多种数据集验证 例如 CWRU PU IMS JNU SEU PHM2010等等 这里使用的是IMS 辛辛那提 正常 内圈故障 外圈故障 滚动体故障 原始数据下载官网 Prognostics Center of Excel
  • CentOS7 彻底清除MySQL

    MySQL完全删除 参考文档 http www centoscn com mysql 2017 0517 8791 html 查看已经安装的服务 rpm qa grep i mysql i 作用是不区分大小写 删除这两个服务 去掉后缀 rp
  • [思维模式-7]:《如何系统思考》-3- 认识篇 - 什么是系统?系统的特征?

    目录 第1章 什么是系统 1 1 万事万物都是一个有机的系统 1 2 系统的科学定义 1 3 系统的构成 1 4 系统的分类 第2章 动态复杂系统的八大特征 2 1 目的性 2 8 边界 2 3 结构影响行为 2 4 总体大于部分之和 2
  • 数据大屏适配方案 (scale)

    目录 适配方案分析 vw vh 什么是vw和vh vw和百分比的区别是什么 vw怎么使用 实现思路 案例 scale方案 一 scale 方法 1 scaleX x 2 scaleY y 3 scale x y 案例 大屏之关键 前期的自适
  • TemplateSyntaxError at /statistics/ ‘staticfiles‘ is not a registered tag li

    报错django template exceptions TemplateSyntaxError staticfiles is not a registered tag library Mustbe one of admin list ad
  • app基本控件

    一个完整的APP包括四大类 各种 栏 内容视图 控制元素 临时视图 各种 栏 状态栏 导航栏 标签栏 工具栏 搜索栏 范围栏 内容视图 列表视图 卡片视图 集合视图 图片视图 文本视图 控制元素 用于控制产品行为或显示的信息 临时视图 警告
  • IDEA设置启动选择项目

    IDEA设置启动选择项目 IDEA2019 3 5启动后自行选择项目 而不是进入上一次关闭的项目 通过下面的设置修改 将Reopen last project on startup勾选去除
  • 从零开始学Qt(四)信号与槽

    信号与槽 书不记 熟读可记 义不精 细思可精 1 信号 槽是啥 古有 烽火狼烟 传递消息 敌人来犯的消息迅速传达开来 是多么的聪慧啊 烟就是信号 下一个燃火台看到烟后就点燃燃料 这个就槽 换种方法说就是 一个按钮被点击了 会触发一个点击的信