QT学习笔记(四)信号槽与简单的自定义信号

2023-11-11

1. 坐标系

左上角为零点,x向右为正方向,y向下为正方形
在这里插入图片描述

2. 信号

完成连接connect的过程包括以下内容:

  • 信号的发送
  • 信号发送的具体内容
  • 信号的接受
  • 信号的处理(称为槽函数)

3. 信号槽

信号槽的优点: 松散耦合
信号的发送方和接受方本身没有关联(发送端的信号不一定触发接收端处理,接收端也不一定要接收信号后才完成操作),只是通过连接connect将两端耦合在一起。

4. 代码实现点击按钮关掉窗口

#include "mywidget.h"
#include "QPushButton"

mywidget::mywidget(QWidget *parent)
    : QWidget(parent)
{
    //创建按钮
    QPushButton *btn2=new QPushButton("button2",this);//button2为显示文本,this指依赖当前窗口
    
    //改变按钮位置
    btn2->move(100,100);

    //重置按钮大小
    btn2->resize(100,50);
    
    //设置窗口大小
    resize(300,200);//初始窗口大小,用户仍可以拖动

    //建立连接(发送方,信号内容,接受方,信号槽)
    connect(btn2,&QPushButton::clicked,this,&mywidget::close);
}

mywidget::~mywidget()
{
}

效果:点击button2实现关闭
在这里插入图片描述

5. 自定义信号槽

要实现一个效果:

//Mother类
//Daughter类
//下课-》我饿了-》我妈请吃饭
  1. 生成Daughter类和Mother类
    1.1 Daughter类
    右键工程->添加新文件->C++ Class->choose
    在这里插入图片描述
    创建Daughter:
    在这里插入图片描述
    1.2. Mother类
    同样的方法创建Mother类

  2. signals
    2.1 可以看到.h文件下,会有个自带的signals,自定义的信号就写在这里,写法如下:
    ① 返回void 信号
    ② 只需要声明,不需要实现
    ③ 可以有参数,因此可以重载
    2.2 例子:在daughter类里声明一个hungry信号

#ifndef DAUGHTER_H
#define DAUGHTER_H

#include <QObject>

class Daughter : public QObject
{
    Q_OBJECT
public:
    explicit Daughter(QObject *parent = nullptr);

signals:
    //自定义信号写在这里
    //返回void
    //信号只需要声明,不需要实现
    //可以有参数,因此可以重载

    //声明饿了的信号
    void hungry();

};
#endif // DAUGHTER_H
  1. slot
    3.1 槽函数,用来处理信号,不能写在signals部分,可以卸载public或者public slots(老版本),说明:
    ① 返回void,需要声明和定义
    ② 可以有参数,可以重载
    3.2 例子:在mother.h里写一个声明,在mother.cpp里写一个定义
//mother.h
#ifndef MOTHER_H
#define MOTHER_H

#include <QObject>

class Mother : public QObject
{
    Q_OBJECT
public:
    explicit Mother(QObject *parent = nullptr);

    //槽函数写在public下(老版本在public slot下)
    //返回void,需要声明和定义
    //可以有参数,可以重载
    void treat();
signals:
};
#endif // MOTHER_H
// mother.cpp
#include "mother.h"
#include <QDebug>
Mother::Mother(QObject *parent)
    : QObject{parent}
{
}
void Mother::treat()
{
    qDebug()<<"请女儿吃饭";
}
  1. 建立连接
    首先在widget.h声明两个指针
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
    // 声明两个默认的指针
    Mother * m;
    Daughter *d;
};
#endif // WIDGET_H

再在widget.cpp创建对象和连接

#include "widget.h"
#include "ui_widget.h"


//Mother类
//Daughter类
//下课-》我饿了-》我妈请吃饭


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //初始化我的指针,创建对象
    this->m=new Mother(this);//放到对象树里就不用管理释放了
    this->d=new Daughter(this);

    //建立连接(发送方,信号内容,接受方,信号槽)
    connect(d,&Daughter::hungry,m,&Mother::treat);
}

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

此时运行并不会有任何输出,因为并未触发女儿饿了的信号,增加这部分,在widget.h中增加classisover的声明

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include"mother.h"
#include"daughter.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
    // 声明两个默认的指针
    Mother * m;
    Daughter *d;

    void classisover();

};
#endif // WIDGET_H

在widget.cpp中实现触发功能,其中emit是触发的意思

void Widget::classisover()
{
    emit d->hungry();
}

并在主函数中调用classisover,注意,调用classisover必须在建立连接以后

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //初始化我的指针,创建对象
    this->m=new Mother(this);//放到对象树里就不用管理释放了
    this->d=new Daughter(this);

    //建立连接(发送方,信号内容,接受方,信号槽)
    connect(d,&Daughter::hungry,m,&Mother::treat);

    classisover();

}

效果为输出“请女儿吃饭”。
另外,可以加上前面的button部分,实现点击按钮触发classisover,整体的widget.cpp代码为:

#include "widget.h"
#include "ui_widget.h"
#include "QPushButton"


//Mother类
//Daughter类
//下课-》我饿了-》我妈请吃饭


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

    //创建按钮
    QPushButton *btn2=new QPushButton("button2",this);//button2为显示文本,this指依赖当前窗口

    //改变按钮位置
    btn2->move(100,100);

    //重置按钮大小
    btn2->resize(100,50);

    //设置窗口大小
    resize(300,200);//初始窗口大小,用户仍可以拖动


    //初始化我的指针,创建对象
    this->m=new Mother(this);//放到对象树里就不用管理释放了
    this->d=new Daughter(this);


    //建立连接(发送方,信号内容,接受方,信号槽)
    connect(d,&Daughter::hungry,m,&Mother::treat);


    //建立连接(发送方,信号内容,接受方,信号槽)
    connect(btn2,&QPushButton::clicked,this,&Widget::classisover);

}

Widget::~Widget()
{
    delete ui;
}
void Widget::classisover()
{
    emit d->hungry();
}

点击按钮输出请女儿吃饭
在这里插入图片描述

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

QT学习笔记(四)信号槽与简单的自定义信号 的相关文章

  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 我可以使用 lambda 函数或 std::function 对象来代替函数指针吗?

    我有一个需要使用的库 它定义了以下内容 typedef void CallbackFunction const int i 并且有一个注册回调的函数 如下所示 void registerCallback CallbackFunction p

随机推荐

  • 方格填数(2016年蓝桥杯)

    如图 如下的10个格子 填入0 9的数字 要求 连续的两个数字不能相邻 左右 上下 对角都算相邻 一共有多少种可能的填数方案 请填写表示方案数目的整数 看到这题第一个想到的方法就是回溯 就很像八皇后 能填进去就填 填不进去就看下一个位置 我
  • 剑指 Offer 36. 二叉搜索树与双向链表(java+python)

    输入一棵二叉搜索树 将该二叉搜索树转换成一个排序的循环双向链表 要求不能创建任何新的节点 只能调整树中节点指针的指向 为了让您更好地理解问题 以下面的二叉搜索树为例 我们希望将这个二叉搜索树转化为双向循环链表 链表中的每个节点都有一个前驱和
  • 打造属于自己的字体(转)

    打造属于自己的字体 转 more 不少做平面的朋友可能都有过这样的经历 在自己的作品中要使用某种特效字体 但是到处都找不到符合自己要求的 于是有些朋友选择了自己绘制 这当然解决了当时的问题 可你有没有想过 把你绘制的字符图形制作成为真正意义
  • windows下安装,配置gcc编译器

    在Windows下使用gcc编译器 1 首先介绍下MinGW MinGW是指只用自由软件来生成纯粹的Win32可执行文件的编译环境 它是Minimalist GNU on Windows的略称 实际上 MinGW 并不是一个 单纯的C C
  • J2ee集合框架

    一 Collection接口 首先如图所见 Collection是整个集合框架的顶级接口 是Set和List的父接口 但不是Map的父接口 Map也是一个顶级接口 二 List集合的特点 总的来说学习框架就是为了学习容器的数据结构 增删改查
  • Qt:读写SVG

    Qt 读写SVG 绘制SVG图形 SvgView SvgView const QString file QWidget parent QWidget parent doc new QSvgRenderer file this QSvgRen
  • linux安装lcov

    linux安装lcov 一 去官网下载源码压缩包 lcov的github官网 https github com linux test project lcov releases 建议选择较新的版本 这里选择下载的是lcov1 16版本 gc
  • nginx 启动 停止,与报错nginx: [error] open() “/run/nginx.pid“ failed (2: No such file or directory)

    1 寻找nginx启动路径whereis nginx 2 启动 nginx s reload 3 停止 nginx s stop 4 如报错 在执行启动或者停止时 执行 nginx c etc nginx nginx conf
  • Dynamics CRM SLA 使用限制

    自身限制 一 不能循环 例如 Failure设置3天提醒 Warning设置5天提醒 只能是从Applicable From时间开始 第3天Failure 第5天Warning 不能有第二次3天和5天的提醒 不能循环发邮件 例如Warnin
  • 为三个整数排序(30分)

    2 为三个整数排序 30分 题目内容 输入三个整数a b c 按照从小到大的顺序打印输出 输入格式 三个整数 每行一个 输出格式 三个整数 每行一个 输入样例 3 1 22 a int input b int input c int inp
  • 手机端font-size:31.25vw原理

    移动端布局一般使用 方法一 媒体查询 rem 弹性盒子布局 方法二 vw rem 弹性盒子布局 这里说一下vw原理 vw它是根据可视区的宽度来计算的 如果是10vw 就是当前移动设备 浏览器 宽度的十分之一大小 vw 视窗宽度的百分比 1v
  • java集群

    转载 http blog csdn net happyangelling article details 6413584 序言 越来越多的关键应用运行在J2EE Java 2 Enterprise Edition 中 这些诸如银行系统和账单
  • Oracle快速入门(1)——ORACLE数据库简介

    一 什么是ORACLE ORACLE数据库系统是美国ORACLE公司 甲骨文 提供的以分布式数据库为核心的一组软件产品 是目前最流行的客户 服务器 CLIENT SERVER 或B S体系结构的数据库之一 ORACLE通常应用于大型系统的数
  • 编译boost提示错误:LINK : fatal error LNK1104: 无法打开文件“libboost_filesystem-vc100-mt-gd-1_64.lib”

    在Visual Studio 2010下编译出现如下错误 1 gt LINK fatal error LNK1104 cannot open file libboost system vc100 mt gd 1 64 lib 1 gt 1
  • pytorch安装报错:ERROR: torch has an invalid wheel, .dist-info directory not found

    在windows10 anaconda创建虚拟环境后 安装pytorch 运行pip install r requirement txt安装torch时报错 ERROR torch has an invalid wheel dist inf
  • NLP预训练模型系列-GPT-2

    NLP预训练模型 系列文章目录 1 BERT 2 GPT 3 GPT 2 4 GPT 3 目录 NLP预训练模型系列文章目录 前言 1 Abstract 2 Introduction 3 Approach 3 1 Training Data
  • 科大奥锐密立根油滴实验数据_密立根油滴实验数据处理

    刘秋君 回答于 2017 03 05 密立根油滴实验报告 实验题目 密立根油滴实验 电子电荷的测量 实验目的 1 通过对带电油滴在重力场和静电场中运动的测量 验证电荷的不连续性 并测定电子电荷的电荷值e 2 通过实验过程中 对仪器的调整 油
  • Python Wind量化API

    文章目录 导入 代码生成器 各个函数 wds 日期序列函数 wss多维数据函数 wset数据集函数 wsee wses swq 实时行情数据 wsi 获取分钟级别数据 wst 日内 edb 宏观数据 日期函数 tdays ddaysoffs
  • 【page分页工具类】贼好用的分页工具类

    PageUtils工具类如下 package utils import java io Serializable import java util HashMap import java util List import java util
  • QT学习笔记(四)信号槽与简单的自定义信号

    1 坐标系 左上角为零点 x向右为正方向 y向下为正方形 2 信号 完成连接connect的过程包括以下内容 信号的发送 信号发送的具体内容 信号的接受 信号的处理 称为槽函数 3 信号槽 信号槽的优点 松散耦合 信号的发送方和接受方本身没