QT信号与槽实现方式

1、第一种实现方式

        在QT开发工具UI界面先拖入按钮,然后鼠标右键拖入按钮,点击选中槽,在页面选着需要的信号,然后OK,随即将会跳转到类的.cpp文件,(这种UI+代码结合的方式,会自动去绑定信号与槽)。

2、第二种实现方法

        纯代码实现

        2.1、在类的构造文件中绑定信号与槽

QObject::connect(sender,SIGNAL(signal()),receiver, SLOT(slot()));
                sender------发送信号的对象
                SIGNAL(signal())--------信号类型
                receiver-------接收者
                SLOT(slot())--------槽函数

         2.2、类.h头文件声明槽函数

        2.3、槽函数执行功能

         2.4、报错解决

出现QObject::connect: Parentheses expected,这个错是我自己粗心,但也不得不吐槽下qt的不合理设计,connect时槽函数忘记加括号也可以编译通过,而且connect忘记加括号的槽函数是可以接收到信号的,因为我的槽函数里面打印的东西确实有输出。有点坑。

在类中使用信号/槽时一定要加Q_OBJECT宏,signal和slots的参数要一样

槽函数加(): connect(toTopLayerAction, SIGNAL(triggered()), this, SLOT(slotLayerTop()));   // 正确

切记忘了():connect(toTopLayerAction, SIGNAL(triggered()), this, SLOT(slotLayerTop));      // 错误

3、第三种实现方法

3.1、使用Lambda表达式在构造函数中实现

QObject::connect(sender,&Sender::signal, [=]() {/* lambda body */ });

4、第四种方式 

        Qt 5中引入,允许使用函数指针直接 连接信号和槽,这种方式类型安全, 且可以利用IDE 的代码补全和错误检 查。
QObject::connect(sender,&Sender::signal, receiver,&Receiver::slot);

4.1、在构造函数中实现 

 5、自定义信号与槽 

        在Qt 中,自定义信号与槽是实现对象间通信的一种机制。信号和槽是 Qt 对象通信的核心特性,使得一个 对象能够在发生某种事件时通知其他对象。自定义信号与槽的实现步骤如下:
        1. 定义信号 :在 Qt 中,信号是 signals 关键字声明的类成员函数。它们不需要实现,只需声明。例
如:

class MyClass : public QObject {
    Q_OBJECT
public:
    MyClass();
signals:
    void mySignal(int value);
};
在上面的例子中, MyClass 有一个名为 mySignal 的信号,它带有一个整型参数。
        定义槽:槽可以是任何普通的成员函数,但通常在类定义中用 slots 关键字标识。槽 可以有返回类型, 也可以接受参数,但它们的参数类型需要与发出信号的参数类型匹配 。例如:
class MyClass : public QObject {
    Q_OBJECT
public slots:
    void mySlot(int value);
};
在这个例子中,我们定义了一个名为 mySlot 的槽,它接收一个整型参数。
        
        连接信号与槽:使用 QObject::connect 函数将信号与槽连接起来。当信号被发射时,连接到这个信号 的槽将被调用。
MyClass *myObject = new MyClass();
connect(myObject, SIGNAL(mySignal(int)), myObject, SLOT(mySlot(int)));
这行代码连接了 myObject mySignal 信号到同一个对象的 mySlot 槽。
        发射信号:使用 emit 关键字发射信号。当信号被发射时,所有连接到这个信号的槽都会被调用。
emit mySignal(123);
这将触发所有连接到 mySignal 的槽。
        5.1、例1
#include "widget.h"
#include "ui_widget.h"
//widget.cpp
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //连接槽  ,触发对象和接收都是自己
    QObject::connect(this ,SIGNAL(mysignal()) ,this ,SLOT(myslot()));
    QObject::connect( this ,SIGNAL(mysignalparams(int)) ,this ,SLOT(myslotparams(int)) );
    emit mysignal();        //触发信号
    emit mysignalparams(999);   //触发带参数的信号
}

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

void Widget::myslot()     //槽函数
{
    std::cout << "myslot" << std::endl;
}

void Widget::myslotparams(int value)
{
    std::cout << "myslotparams ," << value << std::endl;
    qDebug() << "This is value = " << value;
}

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <iostream>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

signals:            //自定义信号
    void mysignal();
    void mysignalparams(int value);

public slots:       //自定义槽
    void myslot();
    void myslotparams(int value);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

       执行结果

5.2、例2

        创建两个类,比如SenderReceiverSender类将发出信号,而Receiver类将接收并处理这个信号。

// Sender.h  
#ifndef SENDER_H  
#define SENDER_H  
  
#include <QObject>  
  
class Sender : public QObject {  
    Q_OBJECT  
public:  
    explicit Sender(QObject *parent = nullptr);  
  
signals:      
    void mySignal();      //信号
  
public slots:  
    void emitSignal();  
};  
  
#endif // SENDER_H
// Sender.cpp  
#include "Sender.h"  
  
Sender::Sender(QObject *parent) : QObject(parent) {  
}  
  
void Sender::emitSignal() {  
    emit mySignal();          //发送信号
}
// Receiver.h  
#ifndef RECEIVER_H  
#define RECEIVER_H  
  
#include <QObject>  
#include <QDebug>  
  
class Receiver : public QObject {  
    Q_OBJECT  
public:  
    explicit Receiver(QObject *parent = nullptr);  
  
public slots:  
    void handleSignal();      //槽函数
};  
  
#endif // RECEIVER_H
// Receiver.cpp  
#include "Receiver.h"  
  
Receiver::Receiver(QObject *parent) : QObject(parent) {  
}  
  
void Receiver::handleSignal() {  
    qDebug() << "Signal received!";  //槽函数
}
// main.cpp  
#include <QCoreApplication>  
#include "Sender.h"  
#include "Receiver.h"  
  
int main(int argc, char *argv[]) {  
    QCoreApplication a(argc, argv);  
  
    Sender sender;  
    Receiver receiver;  
  
    //连接信号与槽
    QObject::connect(&sender, &Sender::mySignal, &receiver, &Receiver::handleSignal);  
  
    sender.emitSignal(); // 调用函数发送信号
  
    return a.exec();  
}

6、QDebug()

        QDebug 是 Qt 框架中用于输出调试信息的一个类。它提供了一种方便的方式来输出文本到标准输出(通 常是控制台),这对于调试 Qt 应用程序非常有用。 QDebug 类可以与 Qt 的信号和槽机制一起使用,使 得在响应各种事件时能够输出有用的调试信息。
        使用 QDebug 的一个典型方式是通过 qDebug() 函数,它返回一个 QDebug 对象。然后,可以使用流操 作符 << 来输出各种数据类型。例如:
qDebug() << "This is a debug message";
int value = 10;
qDebug() << "The value is" << value;
        当执行这些代码时,它们会在应用程序的控制台输出相应的文本。这对于检查程序的运行状态、变量的 值或者跟踪程序的执行流程非常有帮助。
        还可以使用 qDebug() 来输出自定义类型,只要为这些类型提供了适当的输出操作符重载。此外, Qt 还 提供了 qInfo() , qWarning() , qCritical() qFatal() 函数,用于输出不同级别的信息,分别用 于普通信息、警告、关键错误和致命错误。这有助于对日志信息进行级别划分,从而更好地控制输出内
容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/457969.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【剪枝实战】使用VGGNet训练、稀疏训练、剪枝、微调等,剪枝出只有3M的模型

摘要 本次剪枝实战是基于下面这篇论文去复现的&#xff0c;主要是实现对BN层的γ/gamma进行剪枝操作&#xff0c;本文用到的代码和数据集都可以在我的资源中免费下载到。 相关论文&#xff1a;Learning Efficient Convolutional Networks through Network Slimming (ICCV 2017…

【小白学机器学习9】自己纯手动计算验证,EXCEL的一元线性回归的各种参数值

目录 0 目标 1 构造模型 1.1 构造模型的思路 1.2 具体模型构造的EXCEL公式和过程 2 直接用EXCEL画图&#xff0c;然后生成趋势线的方式进行回归分析 2.1 先选择“观测值Y”的数据&#xff0c;用散点图或者折线图作图 2.2 然后添加趋势线和设置趋势线格式 2.3 生成趋…

服务器Debian 12.x中安装Jupyer并配置远程访问

服务器系统&#xff1a;Debian 12.x&#xff1b;IP地址&#xff1a;10.100.2.138 客户端&#xff1a;Windows 10;IP地址&#xff1a;10.100.2.38 利用ssh登录服务器&#xff1a; 1.安装python3 #apt install python3 2.安装pip #apt install python3-pip … 3.安装virtualen…

HBase分布式数据库的原理和架构

一、HBase简介 HBase是是一个高性能、高可靠性、面向列的分布式数据库&#xff0c;它是为了在廉价的硬件集群上存储大规模数据而设计的。HBase利用Hadoop HDFS作为其文件存储系统&#xff0c;且Hbase是基于Zookeeper的。 二、HBase架构 *图片引用 Hbase采用Master/Slave架构…

PTA-练习1

目录 实验2-3-8 计算火车运行时间 实验2-4-4 求简单交错序列前N项和 实验2-4-5 输出华氏-摄氏温度转换表 实验3-4 统计字符[2] 实验3-5 查询水果价格 实验3-11 求一元二次方程的根 实验4-1-1 统计数字字符和空格 实验2-3-8 计算火车运行时间 时钟数有两种情况&#xff1…

使用BBDown下载bilibili视频的方法

一款命令行式哔哩哔哩下载器. Bilibili Downloader. 下载地址 https://github.com/nilaoda/BBDown 功能 番剧下载(Web|TV|App) 课程下载(Web) 普通内容下载(Web|TV|App) 合集/列表/收藏夹/个人空间解析 多分P自动下载 选择指定分P进行下载 选择指定清晰度进行下载 下载外挂字幕…

解决驱动开发中<stdlib.h> no such file 的问题

前言 在进行驱动开发时&#xff0c;需要使用malloc等函数&#xff0c;导入C库<stdlib.h>出现bug。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以关注本博主并订阅本专栏&#xff0c;一起讨论…

java并发编程之 volatile关键字

1、简单介绍一下JMM Java 内存模型&#xff08;Java Memory Model 简称JMM&#xff09;是一种抽象的概念&#xff0c;并不真实存在&#xff0c;指一组规则或规范&#xff0c;通过这组规范定义了程序中各个变量的访问方式。java内存模型(JMM)屏蔽掉各种硬件和操作系统的内存访问…

OpenvSwitch VXLAN 隧道实验

OpenvSwitch VXLAN 隧道实验 最近在了解 openstack 网络&#xff0c;下面基于ubuntu虚拟机安装OpenvSwitch&#xff0c;测试vxlan的基本配置。 节点信息&#xff1a; 主机名IP地址OS网卡node1192.168.95.11Ubuntu 22.04ens33node2192.168.95.12Ubuntu 22.04ens33 网卡信息&…

XUbuntu22.04之关闭todesk开机自启动(二百二十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Python数据分析-4

1.对于一组电影数据&#xff0c;呈现出rating,runtime的分布情况&#xff1a; #encodingutf-8 import pandas as pd import numpy as np from matplotlib import pyplot as plt file_path "./youtube_video_data/IMDB-Movie-Data.csv" df pd.read_csv(file_path) …

React低代码平台实战:构建高效、灵活的应用新范式

文章目录 每日一句正能量前言一、React与低代码平台的结合优势二、基于React的低代码平台开发挑战三、基于React的低代码平台开发实践后记好书推荐编辑推荐内容简介作者简介目录前言为什么要写这本书 读者对象如何阅读本书 赠书活动 每日一句正能量 人生之美&#xff0c;不在争…

C# 根据两点名称,寻找两短路程的最优解,【有数据库设计,完整代码】

前言 如果我们遇到路径问题&#xff0c;可以使用点点连线&#xff0c;给定一个点&#xff0c;可以到达另外几个点&#xff0c;寻找最优解 例&#xff1a;如下图所示&#xff0c;如果要从A1-C1,可以有三条路 1.A1-B1-C1 2.A1-B2-C1 3.A1-B3-C1 最优解肯定是A1-B1-C1&#xff0c…

15. jwt认证中间件

在上一篇登录功能的实现中&#xff0c;我们使用了jwt作为鉴权组件&#xff0c;其中登录后会颁发token。前端在访问后续请求时&#xff0c;可以带上这个token。对于一些需要权限校验的请求&#xff0c;我们就需要验证这个token&#xff0c;从token中获取到用户id&#xff08;有了…

Unity Timeline学习笔记(1) - 创建TL和添加动画片段

Timeline在刚出的时候学习了一下&#xff0c;但是因为一些原因一直都没用在工作中使用。 版本也迭代了很久不用都不会用了&#xff0c;抽时间回顾和复习一下&#xff0c;做一个笔记后面可以翻出来看。 创建Timeline 首先我们创建一个场景&#xff0c;放入一个Plane地板&#…

【机器学习智能硬件开发全解】(四)—— 政安晨:嵌入式系统基本素养【后摩尔时代】

随着物联网、大数据、人工智能时代的到来&#xff0c;海量的数据分析、大量复杂的运算对CPU的算力要求越来越高。 CPU内部的大部分资源用于缓存和逻辑控制&#xff0c;适合运行具有分支跳转、逻辑复杂、数据结构不规则、递归等特点的串行程序。 在集成电路工艺制程将要达到极…

PgSQL技术内幕 - 优化器如何估算行数

PgSQL技术内幕 - 优化器如何估算行数 PgSQL优化器根据统计信息估算执行计划路径的代价&#xff0c;从而选择出最优的执行计划。而这些统计信息来自pg_statistic&#xff0c;当然这个系统表是由ANALYZE或者VACUUM进行样本采集而来。关于该系统表的介绍详见&#xff1a;PgSQL技术…

水泵房远程监控物联网系统

随着物联网技术的快速发展&#xff0c;越来越多的行业开始利用物联网技术实现设备的远程监控与管理。水泵房作为城市供水系统的重要组成部分&#xff0c;其运行状态的监控与管理至关重要。HiWoo Cloud作为专业的物联网云服务平台&#xff0c;为水泵房远程监控提供了高效、稳定、…

2.1HTML5基本结构

HTML5实际上不算是一种编程语言&#xff0c;而是一种标记语言。HTML5文件是由一系列成对出现的元素标签嵌套组合而成&#xff0c;这些标签以<元素名>的形式出现&#xff0c;用于标记文本内容的含义。浏览器通过元素标签解析文本内容并将结果显示在网页上&#xff0c;而元…

基于centos7的k8s最新版v1.29.2安装教程

k8s概述 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态&#xff0c;其服务、支持和工具的使用范围相当广泛。 Kubernetes 这个名字源于希腊语&…