直播相关02-录制麦克风声音,QT 信号与槽,自定义信号和槽

一 信号与槽函数

#include "mainwindow.h"
#include <QPushButton>
#include <iostream>
using namespace std;//我们的目的是在 window中加入一个button,当点击这个button后,关闭 MainWindow 。
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{//注意,这里是new 了一个 QpushButton的,那么理论上要 delete 这个loginButton 。这里为什么 没有呢?QPushButton * loginButton = new QPushButton();loginButton->setText("登陆");loginButton->setParent(this); // 将自己挂载到当前的 mianwindow上,这意味着,当 mainwindows 销毁的时候,loginbutton 会跟着销毁,因此不用手动的调用 elete loginbuttonloginButton->setFixedSize(100,30); // 设置button 为固定大小//我们将 loginbutton 的 clicked信号,给MainWindow 的 close槽函数。//qpushbutton 的clicked 信号,是qpushbutton 自带的信号//mainwindows 的close 槽函数,是 mainwindows 自带的槽函数connect(loginButton,&QPushButton::clicked,this,&MainWindow::close);}MainWindow::~MainWindow()
{
}

二 自定义信号和 自定义 槽函数

1.自定义信号,添加一个C++ 类,要继承 QObject

主要你要自定义信号与槽,就一定要 Add Q_OBJECT

sender.h 文件

#ifndef SENDER_H
#define SENDER_H#include <QObject>class Sender : public QObject
{//主要你要自定义信号与槽,就一定要 Add Q_OBJECT,这个取消了会有问题Q_OBJECT
public:explicit Sender(QObject *parent = nullptr);signals://自定义信号,只需要在.h文件中声明就可以了,不需要在.cpp中实现void exit();void start();
};#endif // SENDER_H

2.自定义槽函,添加一个C++类,要继承 QObject

在receiver.h 中定义这两个槽函数

在receiver.cpp中实现这两个槽函数

#ifndef RECEIVER_H
#define RECEIVER_H#include <QObject>class receiver : public QObject
{//主要你要自定义信号与槽,就一定要 Add Q_OBJECT,这个取消了会有问题Q_OBJECT
public:explicit receiver(QObject *parent = nullptr);signals://槽函数是要给别人调用的,因此在public slots 后 写 槽函数,在.cpp文件中写实现.
public slots:void handleExit();void handleStart();};#endif // RECEIVER_H

#include "receiver.h"
#include <iostream>
using namespace std;receiver::receiver(QObject *parent) : QObject(parent)
{}void receiver::handleExit(){cout<<"receiver handleExit method "<<endl;
}
void receiver::handleStart(){cout<<"receiver handleStart method "<<endl;
}

3.调用

这里为了方便期间,将上述两个类 重命名为 customerreceiver.h   和  customersender.h

    //将信号发送者 和 信号 接受者 建立关联
    //使用emit 发送信号, 实际上就是 调用 发送者的信号函数
 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "customersender.h"
#include "customerreceiver.h"
#include <iostream>
using namespace std;MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{cout<<"qt custom single custom slot"<<endl;ui->setupUi(this);CustomerSender * customersender = new CustomerSender;CustomerReceiver * customerrecevier =  new CustomerReceiver();//将信号发送者 和 信号 接受者 建立关联connect(customersender,&CustomerSender::start,customerrecevier,&CustomerReceiver::handleStart);connect(customersender,&CustomerSender::exit,customerrecevier,&CustomerReceiver::handleExit);cout<<"00000 log for watch"<<endl;//使用emit 发送信号, 实际上就是 调用 发送者的信号函数emit customersender->start();cout<<"11111log for watch"<<endl;emit customersender->exit();cout<<"222"<<endl;//由于 customersender 和 customerrecevier 并没有挂载到当前mainwindows上,类似这样customersender->setParent(this);因此要手动deletedelete customersender;delete customerrecevier;
}MainWindow::~MainWindow()
{delete ui;
}

4. 当自定义信号 和 自定义槽函数 有参数或者返回值的时候

自定义信号 addmethodstart ,参数为 int a 和 int b

返回值double 目前不知道有啥用

signals://自定义信号,只需要在.h文件中声明就可以了,不需要在.cpp中实现void exit();void start();double addmethodstart(int a ,int b );

自定义槽函数

    int handleAddFuncation();double handleAddFuncation2(int n , int m);int CustomerReceiver::handleAddFuncation(){cout<<"CustomerReceiver handleAddFuncation method return 100"<<endl;return 100;
}double CustomerReceiver::handleAddFuncation2(int n , int m){cout<<"CustomerReceiver handleAddFuncation2 method return n+m "<< n+m << endl;return n+m;
}

当我们发送一个信号的时候,如果有槽函数有对应的 int,int 参数,则会接受 信号发送的2000,3000的值传递到槽函数中。

如果槽函数没有对应的int,int 参数,则不传递

    connect(customersender,&CustomerSender::addmethodstart,customerrecevier,&CustomerReceiver::handleAddFuncation);cout<< emit customersender->addmethodstart(200,300);//由于 handleAddFuncation 函数没有参数,因此这个200,300传递不到槽函数handleAddFuncation中cout<<"333"<<endl;connect(customersender,&CustomerSender::addmethodstart,customerrecevier,&CustomerReceiver::handleAddFuncation2);cout<< emit customersender->addmethodstart(2000,3000);//由于handleAddFuncation2 有int,int 的参数 ,因此这个2000,3000会传递给槽函数 handleAddFuncation2

返回值问题,信号的返回值目前没有发现意义是啥,

槽函数的返回值 可以通过 emit 信号函数返回。

例如:

cout<< emit customersender->addmethodstart(200,300);
会打印 100出来,这是因为 对应的槽函数 handleAddFuncation 返回值是100

5. 连接多个信号

connect 函数除了可以连接一个 信号和一个槽函数外,

还可以连接一个信号 和 另一个信号 .

类似于连锁反应

customersender2.h

#ifndef CUSTOMERSENDER2_H
#define CUSTOMERSENDER2_H#include <QObject>class customersender2 : public QObject
{Q_OBJECT
public:explicit customersender2(QObject *parent = nullptr);signals:void deletebutton2();
};#endif // CUSTOMERSENDER2_H

customersender3.h

#ifndef CUSTOMERSENDER3_H
#define CUSTOMERSENDER3_H#include <QObject>class customersender3 : public QObject
{Q_OBJECT
public:explicit customersender3(QObject *parent = nullptr);signals:void deletebutton3();
};#endif // CUSTOMERSENDER3_H

customerreceuver2.h
#ifndef CUSTOMERRECEUVER2_H
#define CUSTOMERRECEUVER2_H#include <QObject>class customerreceuver2 : public QObject
{Q_OBJECT
public:explicit customerreceuver2(QObject *parent = nullptr);signals:public slots:void handledeletebutton2();
};#endif // CUSTOMERRECEUVER2_H

customerreceuver3.h

#ifndef CUSTOMERRECEUVER3_H
#define CUSTOMERRECEUVER3_H#include <QObject>class customerreceuver3 : public QObject
{Q_OBJECT
public:explicit customerreceuver3(QObject *parent = nullptr);signals:public slots:void handledeletebutton3();
};#endif // CUSTOMERRECEUVER3_H

customerreceuver2.cpp
#include "customerreceuver2.h"
#include <iostream>
using namespace  std;customerreceuver2::customerreceuver2(QObject *parent) : QObject(parent)
{}void customerreceuver2::handledeletebutton2(){cout<<"customerreceuver2::handledeletebutton2"<<endl;
}

customerreceuver3.cpp

#include "customerreceuver3.h"
#include <iostream>
using namespace std;customerreceuver3::customerreceuver3(QObject *parent) : QObject(parent)
{}void customerreceuver3::handledeletebutton3(){cout<<"customerreceuver3::handledeletebutton3"<<endl;}

调用

        cout<<" single to single"<<endl;customersender2 *cus2 = new customersender2;customersender3 *cus3 = new customersender3;customerreceuver2 *cusre2 =  new customerreceuver2;customerreceuver3 *cusre3 =  new customerreceuver3;connect(cus2, &customersender2::deletebutton2,cusre2,&customerreceuver2::handledeletebutton2);emit cus2->deletebutton2();cout<<"111"<<endl;connect(cus3, &customersender3::deletebutton3,cusre3,&customerreceuver3::handledeletebutton3);emit cus3->deletebutton3();cout<<"222 "<<endl;cout<<"after this line will be test single to single"<<endl;//让 sender2 的信号deletebutton2 唤醒 sender3 的信号 deletebutton3connect(cus2, &customersender2::deletebutton2,cus3, &customersender3::deletebutton3);emit cus2->deletebutton2();cout<<"333333"<<endl;//    single to single
//    customerreceuver2::handledeletebutton2
//    111
//    customerreceuver3::handledeletebutton3
//    222 
//    after this line will be test single to single
//    customerreceuver2::handledeletebutton2
//    customerreceuver3::handledeletebutton3
//    333333

6.labmda 表达式

    //for test labmda,假设我们不想写receiverconnect(cus2, &customersender2::deletebutton2,[](){cout<<"labmda called"<<endl;});emit cus2->deletebutton2();cout<<"666666"<<endl;

三 当QT使用 genetate form 创建UI后,如何使用 信号和槽函数呢?

也就是说,我们使用了QT 的 generate form 来创建UI

我们在弄了两个pushbutton,一个登陆,一个注册,可以观察到 QT会给key 命名为 pushButton,一个为pushButton_2,当然可以改动这个key的值,

我们这里重新命名为 loginbutton和registerbutton

检查 编辑 下的 UI 的button,如下:

那么我们想要给这两个button 添加 信号和槽事件应该怎么弄呢?

点击 "转到槽" 做了两件事情

1. 点击那个信号  相当于 选择了那个 信号

2.然后生成 该信号 对应的 槽函数

例如我们点击了 clicked() 信号,就会生成  void on_loginbutton_clicked() 参函数

 

槽函数的位置

那么 emit 是在什么时候调用呢?实际上我们是看不到的,QT内部帮我们实现了,只要我们完成了上述的 button 的 转到槽函数, 就可以了

测试:

手动的写 槽函数,而不是通过自动生成

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

828华为云征文 | 华为云Flexus X实例上实现Docker容器的实时监控与可视化分析

前言 华为云Flexus X&#xff0c;以顶尖算力与智能调度&#xff0c;引领Docker容器管理新风尚。828企业上云节之际&#xff0c;Flexus X携手前沿技术&#xff0c;实现容器运行的实时监控与数据可视化&#xff0c;让管理变得直观高效。无论是性能瓶颈的精准定位&#xff0c;还是…

TS 常用类型

我们经常说TypeScript是JavaScript的一个超级 TypeScript 常用类型 TypeScript 是 JS 的超集&#xff0c;TS 提供了 JS 的所有功能&#xff0c;并且额外的增加了&#xff1a;类型系统 所有的 JS 代码都是 TS 代码 JS 有类型&#xff08;比如&#xff0c;number/string 等&…

客厅无主灯设计:灯位布局与灯光灯具的和谐搭配

在现代家居设计中&#xff0c;客厅作为家庭活动的中心区域&#xff0c;其照明设计的重要性不言而喻。无主灯设计以其灵活多变、氛围营造独特的优势&#xff0c;逐渐成为客厅照明的热门选择。然而&#xff0c;如何合理规划灯位布局&#xff0c;并科学搭配灯光与灯具&#xff0c;…

基于java+springboot+vue实现的林业产品推荐系统(文末源码+Lw)135

基于SpringBootVue的实现的林业产品推荐系统&#xff08;源码数据库万字Lun文流程图ER图结构图演示视频软件包&#xff09; 系统功能&#xff1a; 林业产品推荐系统是在MySQL中建立数据表保存信息&#xff0c;运用SpringBoot框架和Java语言编写。 并按照软件设计开发流程进行…

ICETEK-DM6437-AICOM—— DMA直接存储器访问设计

#一、设计目的&#xff1a; 1 进一步了解 ICETEK-DM6437-AF 的内部存储器空间的分配及指令寻址方式&#xff1a; 内部存储器空间分配&#xff1a;研究 ICETEK-DM6437-AF 的存储器架构&#xff0c;包括但不限于片内 SRAM、片外 DRAM 和其他存储器模块。了解这些存储器的大小、起…

k8s 资源管理

文章目录 ResourceQuota什么是资源配额定义一个ResourceQuotaResourceQuota的使用 LimitRangeLimitRange的用途示例1&#xff1a;配置默认的requests和limits示例2&#xff1a;配置requests和limits的范围 QoS什么是服务质量保证示例1&#xff1a;实现QoS为Guaranteed的Pod示例…

优化安防视频监控的关键体验:视频质量诊断技术如何应用在监控系统中?

随着科技的不断进步&#xff0c;视频监控平台在公安、司法、教育、基础设施等众多领域得到了广泛应用。然而&#xff0c;视频图像的质量直接关系到监控系统的应用效果&#xff0c;是反映监控系统运维效果的重要指标之一。因此&#xff0c;视频监控平台需要配备一系列先进的视频…

Active Neural SLAM 复现记录

Active Neural SLAM 复现记录 创建虚拟环境安装habitat-sim安装habitat-api安装Pytorch配置项目准备数据先搞Gibson场景数据再搞pointnav任务数据创建软链接 测试训练 创建虚拟环境 conda create -n AVSLAM python3.10 conda activate AVSLAM安装habitat-sim git clone https…

存储课程学习笔记8_spdk的安装以及简单demo测试

已经对相关的基础概念有一定的了解&#xff0c;比如裸盘&#xff0c;文件系统&#xff0c;读写相关裸盘&#xff0c;裸盘挂载使用&#xff0c;内核插入文件系统的方式&#xff0c;相关操作io的库或者函数&#xff08;io_uring, readv&#xff0c;writev, mmap等&#xff09;&am…

nlohmann::json中有中文时调用dump转string抛出异常的问题

问题描述 Winodows下C开发想使用一个json库&#xff0c;使用的nlohmann::json&#xff0c;但是遇到json中使用中文时&#xff0c;转成string&#xff0c;会抛出异常。 nlohmann::json contentJson;contentJson["chinese"] "哈哈哈";std::string test con…

前端算法(持续更新)

1、最大的钻石 1楼到n楼的每层电梯口都放着一个钻石&#xff0c;钻石大小不一。你从电梯1楼到n楼&#xff0c;每层楼电梯门都会打开一次&#xff0c;只能拿一次钻石&#xff0c;问怎样才能最大的钻石&#xff1f; 解题思路&#xff1a; 这是一个经典的动态规划问题&#xff…

让人眼前一亮的软件测试简历,收不到面试邀请算我输

不知道大家的简历是不是都写成下面这样 根据需求文档进行需求分析 熟悉业务流程&#xff0c;明确测试点 根据测试点设计测试用例 参与评审测试用例 提交和回归跟踪缺陷&#xff0c;确认修复完成之后关闭Bug 通过使用Fiddler进行抓包分析并定位前后端Bug 使用简单的SQL语…

git一个项目关联多个远程仓库

一行代码就行&#xff1a; git remote set-url origin [想要关联的远程仓库地址]想要关联哪个就切换哪个 或者不用每次切换&#xff0c;集中管理&#xff1a; Git->Manage Remotes 点击“”&#xff0c;填入Name和想要关联的远程库地址 每次push时执行命令 git push [为…

美团OC感想

OC感想 晚上十点拿到美团意向了 到家事业部。&#xff0c;日常实习没过&#xff0c;暑期实习没过&#xff0c;秋招终于意向了&#xff0c;晚上十点发的&#xff0c;整整激动到一点才睡着&#xff0c;不仅因为这是秋招的第一个意向&#xff0c;更因为这是我一直心心念念想去的地…

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录 [web][极客大挑战 2019]Http 考点&#xff1a;Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点&#xff1a;弱密码字典爆破 四种方法&#xff1a; [web][极客大挑战 2019]Http 考点&#xff1a;Referer协议、UA协议、X-Forwarded-For协议 访问…

五款知名国内外OA系统厂商盘点,优缺点一目了然!

本文将推荐五款知名的OA系统&#xff0c;助力企业选型&#xff01; OA 系统就像是企业办公的智慧枢纽。它整合了流程审批、文档管理、沟通协作等多种功能&#xff0c;让企业的日常办公更加高效有序。就好比一个多功能的办公工具箱&#xff0c;为企业提供各种实用的工具。 然而…

研1日记9

1.理解conv1d和conv2d a. 1和2处理的数据不同&#xff0c;1维数据和图像 b. 例如x输入形状为(32,19,512)时&#xff0c;卷积公式是针对512的&#xff0c;而19应该变换为参数中指定的输出通道。 2.“SE块”&#xff08;Squeeze-and-Excitation Block&#xff09;它可以帮助模…

jenkins工具的介绍和gitlab安装

使用方式 替代手动&#xff0c;自动化拉取、集成、构建、测试&#xff1b;是CI/CD持续集成、持续部署主流开发模式中重要工具&#xff1b;必须组件 jenkins-gitlab&#xff0c;代码公共仓库服务器&#xff08;至少6G内存&#xff09;&#xff1b;jenkins-server&#xff0c;需…

无人机视角-道路目标检测数据集 航拍 8600张 voc yolo

数据集名称&#xff1a; 无人机视角-道路目标检测数据集 数据集规模&#xff1a; 图像数量&#xff1a;8600张拍摄方式&#xff1a;航拍&#xff08;使用无人机拍摄&#xff09;标注格式&#xff1a;支持VOC和YOLO格式 数据集内容&#xff1a; 该数据集由无人机从空中拍摄的…

网络安全架构师

网络安全架构师负责构建全面的安全框架&#xff0c;以保护组织的数字资产免受侵害&#xff0c;确保组织在数字化转型的同时维持强大的安全防护。 摩根大通的网络安全运营副总裁兼安全架构总监Lester Nichols强调&#xff0c;成为网络安全架构师对现代企业至关重要&#xff0c;…