当前位置: 首页 > news >正文

【QT】信号和槽

img

一、前置示例代码

  1. main.cpp
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);		// 应用程序对象a,在Qt中,应用程序对象,有且仅有一个。Widget w;						// 窗口对象w, Widget父类-》 QWidgetw.show();						// 窗口对象w, 默认不会显示,必须调用show方法显示窗口。return a.exec();				// 让应用程序对象a,进入消息循环--》  while(1);
}

  1. widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();signals:void isSignal(int signal = 0);
public slots:void isSlot(int slot);};
#endif // WIDGET_H

  1. widget.cpp
#include "widget.h"
#include <QDebug>Widget::Widget(QWidget *parent) : QWidget(parent)
{// 信号和槽的绑定:connect(this, &Widget::isSignal, this, &Widget::isSlot);// 发送信号:emit isSignal(1);
}Widget::~Widget()
{
}// 槽函数的实现:
void Widget::isSlot(int slot){QString qString;qDebug()<< "我是槽函数,我收到的信号是:" << qString.number(slot);
}

程序输出:

我是槽函数,我收到的信号是: "1"

注意:我们并没有直接给槽函数的变量 slot 赋值。 ==槽函数的slot的值,是从信号的signal传递而来的==。




二、信号槽如何传递参数

  1. 信号和槽函数的参数,类型必须进行一一对应,如信号的参数为int,槽函数的参数也为int。

信号:

signals:void isSignal(int signal = 0);

槽的定义:

public slots:void isSlot(int slot);

槽的实现:

void Widget::isSlot(int slot){QString qString;qDebug()<< "我是槽函数,我收到的信号是:" << qString.number(slot);
}

发送信号:

emit isSignal(1);

程序输出:

我是槽函数,我收到的信号是: "1"

可以看出,当信号发送后,信号函数的signal 的参数值 “ 1” ,已经成功传递给 槽函数的 接收变量 slot, slot = 1。



  1. 当信号的参数与槽函数的参数数量不同时,只能是信号的参数数量,多于槽函数的参数数量,且前面相同数量的参数类型应一致,信号中多余的参数会被忽略。

信号:

signals:void isSignal(int signal = 0, QString s = "我是信号");

槽的定义:

public slots:void isSlot(int slot);

槽的实现:

void Widget::isSlot(int slot){QString qString;qDebug()<< "我是槽函数,我收到的信号是:" << qString.number(slot);
}

发送信号:

emit isSignal(2, "你好");

程序输出:

我是槽函数,我收到的信号是: "2"

可以看出,当信号发送后,信号函数的signal 的参数值 “ 2” ,被成功传递给 槽函数的 接收变量 slot, slot = 2。而 s = “你好” 被忽略。




三、信号和槽发生重载

  1. teacher.h
signals:void hungry();void hungry(QString foodName);

  1. student.h && student.cpp
public slots:void treat();void treat(QString foodName);void Student::treat(){qDebug()<<"请老师吃饭";
}void Student::treat(QString foodName){qDebug()<<"请老师吃饭,吃:" << foodName.toUtf8().data();
}

  1. widget.h
#include "teacher.h"
#include "student.h"class Widget : public QWidget
{
public:Teacher * ls;Student * st;
};

  1. widget.cpp
#include "widget.h"
#include <QPushButton>
#include <QDebug>//Teacher类 老师类
//student类 学生类
//下课后,老师会触发一个信号,饿了,学生响应信号,请客吃饭Widget::Widget(QWidget *parent) : QWidget(parent)
{//创建一个老师对象this->ls = new Teacher(this);//创建一个学生对象this->st = new Student(this);//连接带参数的信号和槽--1void (Teacher:: * teacherSignal_void)() = &Teacher::hungry;void (Student:: * studentSlot_void)() = &Student::treat;connect(ls,teacherSignal_void,st,studentSlot_void);emit ls->hungry();qDebug()<<"---------------";//连接带参数的信号和槽--2void (Teacher:: * teacherSignal)(QString) = &Teacher::hungry;void (Student:: * studentSlot)(QString) = &Student::treat;connect(ls,teacherSignal,st,studentSlot);emit ls->hungry("宫爆鸡丁");
}Widget::~Widget()
{
}

程序输出:

请老师吃饭
---------------
请老师吃饭,吃: 宫爆鸡丁

此外,我们可以通过setParent函数为 QObject 对象设置一个父对象

//创建一个老师对象
this->ls = new Teacher(this);
//创建一个学生对象
this->st = new Student(this);

当父对象被析构时,它会自动析构其所有的子对象。这意味着无需手动管理子对象的销毁,减轻了开发人员的负担,并确保在不再需要这些子对象时,它们会被正确地释放。




四、信号与槽的参数不对应–使用Lambda表达式

widget.cpp

#include "widget.h"
#include <QPushButton>
#include <QDebug>//Teacher类 老师类
//student类 学生类
//下课后,老师会触发一个信号,饿了,学生响应信号,请客吃饭Widget::Widget(QWidget *parent) : QWidget(parent)
{//创建一个老师对象this->zt = new Teacher(this);//创建一个学生对象this->st = new Student(this);//点击一个按钮,再进行下课QPushButton * btn = new QPushButton("下课",this);setFixedSize(600,400);//连接带参数的信号和槽//指针->地址,函数指针->函数地址void (Teacher::*teacherSignal)(QString) = &Teacher::hungry;void (Student::*studentSlot)(QString) = &Student::treat;connect(zt,teacherSignal,st,studentSlot);//信号连接信号 一个信号触发另一个信号//-----------------------------------------------------connect(btn,&QPushButton::clicked,zt,teacherSignal);//-----------------------------------------------------
}Widget::~Widget()
{   
}

程序报错:

static assertion failed: Signal and slot arguments are not compatible

clicked信号的原型为:

void clicked(bool checked = false)

hungry槽的原型为:

 void hungry(QString foodName);

原因为信号的参数与槽函数参数不对应。 bool型 和 QString 的类型不同。



正确写法:

connect(btn,&QPushButton::clicked,zt,teacherSignal);

改为:

connect(btn,&QPushButton::clicked, this, [this](){emit ls->hungry("宫爆鸡丁");
});

或:

connect(btn,&QPushButton::clicked, [this](){emit this->ls->hungry("宫爆鸡丁");
});

该connect只有三个参数,在三个参数情况下,默认第三个槽函数的对象是本类this,也就是第三个参数this被省略了。

如果第三个参数是this,第四个参数是Lambda表达式,则可以省略第三个参数 this。

个人实测,第三个参数写ls也行:

connect(btn,&QPushButton::clicked, ls, [this](){emit ls->hungry("宫爆鸡丁");
});

程序输出:

请老师吃饭,吃: 宫爆鸡丁
请老师吃饭,吃: 宫爆鸡丁
请老师吃饭,吃: 宫爆鸡丁
请老师吃饭,吃: 宫爆鸡丁




参考连接:

《Qt5:信号和槽使用示例》

qt报错:static assertion failed: Signal and slot arguments are not compatible

信号槽如何传递参数(或带参数的信号槽)

相关文章:

【QT】信号和槽

一、前置示例代码 main.cpp #include "widget.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv); // 应用程序对象a&#xff0c;在Qt中&#xff0c;应用程序对象&#xff0c;有且仅有一个。Widget w; // 窗口对…...

有话则长,无话则短

有话则长&#xff0c;无话则短...

云台/稳定器/无人机姿态控制之欧拉角与四元数控制优缺点分析

基于欧拉角的姿态控制简述&#xff1a; 通过陀螺仪数据解算出姿态&#xff1a;pitch,roll,yaw(相对航向)&#xff0c;根据目标 姿态:dst_pitch,dst_roll,dst_yaw计算出误差姿态pitch_err,roll_err,yaw_err。将误差姿态转换为目标速度e_pitch_rate,e_roll_rate,e_yaw_rate。然后…...

Go 工具链详解(六):依赖管理神器

go mod 是 Golang 的官方依赖管理工具&#xff0c;从 Go 1.11 版本开始引入。go mod 使用一种被称为模块&#xff08;modules&#xff09;的方式来管理依赖&#xff0c;每个模块都包含了一组 Golang 包。一个 Go 程序可以由多个模块组成&#xff0c;每个模块都可以有自己的 go.…...

C语言解决约瑟夫环问题

约瑟夫环问题是一个经典的数学问题&#xff0c;它的描述如下&#xff1a;有n个人围成一圈&#xff0c;从第1个人开始报数&#xff0c;数到第m个人出列&#xff0c;然后从出列的下一个人开始重新报数&#xff0c;数到第m个人出列&#xff0c;如此循环&#xff0c;直到最后一个人…...

6.6 Elasticsearch(六)京淘项目改造

文章目录 1.项目准备2.基础配置2.1 添加pom.xml依赖2.2 yml配置es服务器地址列表 3.具体实现3.1 item实体类封装3.2 添加接口3.3 SearchController 4.search.jsp界面4.1 搜索内容展示4.2 高亮内容样式设置4.3 搜索框内容回填4.4 添加上下页按钮 1.项目准备 我们切换回到此前的…...

Socks5代理:数字化时代的技术支柱

随着数字化时代的到来&#xff0c;技术不仅改变了我们的日常生活&#xff0c;还重新定义了商业、通信、娱乐和全球互联。在这一浪潮中&#xff0c;Socks5代理技术崭露头角&#xff0c;成为跨界电商、爬虫数据分析、企业出海和游戏体验的关键推动力。这项技术不仅在实现数字化愿…...

基本微信小程序的汽车租赁公司小程序

项目介绍 任何系统都要遵循系统设计的基本流程&#xff0c;本系统也不例外&#xff0c;同样需要经过市场调研&#xff0c;需求分析&#xff0c;概要设计&#xff0c;详细设计&#xff0c;编码&#xff0c;测试这些步骤&#xff0c;基于Java语言、微信小程序技术设计并实现了汽…...

Leetcode刷题详解——搜索插入位置

1. 题目链接&#xff1a;35. 搜索插入位置 2. 题目描述&#xff1a; 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。…...

centos升级openssh

注意&#xff1a; openssh升级异常会造成服务失联&#xff0c;如果在允许的情况下可以安装talent服务&#xff0c;使用talent升级&#xff1b; 如果不能安装talent服务&#xff0c;可以打开多个终端&#xff0c;启动ping命令&#xff0c;防止升级终端失败后&#xff0c;作为备用…...

架构、框架、模式,极简文字介绍

1、架构、框架、模式是一种从大到小的关系&#xff0c;也是一种组合关系 2、架构一般针对一个行业或一类应用&#xff0c;是技术和应用的完美组合 3、框架比较小&#xff0c;很多表现为中间件&#xff0c;框架一般是从技术角度解决同类问题&#xff0c;从技术的横切面来解决实…...

Java实现Fisher‘s Exact Test 的置信区间的计算

实现代码 package com.bgi.aigi.common.utils;public class FisherExactUtils {public static double[] getConfidenceInterval(double[][] data) {if (datanull||data.length!2||data[0].length!2||data[1].length!2) {return null;}double[] intervalnew double[2];double …...

YOLOv8改进:全网原创首发 | 新颖的多尺度卷积注意力(MSCA),即插即用,助力小目标检测 | NeurIPS2022

💡💡💡本文全网首发独家改进:多尺度卷积注意力(MSCA),有效地提取上下文信息,新颖度高,创新十足。 1)作为注意力MSCA使用; 推荐指数:五星 MSCA | 亲测在多个数据集能够实现涨点,多尺度特性在小目标检测表现也十分出色。 💡💡💡Yolov8魔术师,独家首发…...

linux中好玩的数据流定向和管道命令一

知识点复习&#xff1a; 什么是数据流定向&#xff0c;个人理解就是将 一些结果信息不打印在屏幕上&#xff0c;而是定位在某一个文件里面 ll /wdf > file 会覆盖file的原内容 ll /wdf >> 会追加到原文件后面 比如在自己的目录新建1.TXT&#xff0c; 2.txt ll /…...

tesseract-ocr-w64-setup-5.3.3.20231005.exe 百度网盘下载

链接&#xff1a;https://pan.baidu.com/s/1q6u-nRvj2S8n6jSYz2iqig?pwdbtm4 提取码&#xff1a;btm4...

Linux环境下Redis 集群部署

Linux环境下Redis 集群部署 1.单机Redis部署2.Redis 集群配置2.1 创建redis集群安装目录2.2 将redis单机部署目录下的redis.confi文件复制到每个目录下2.3 修改每个文件夹下的redis.conf2.4 修改完六个配置内容后开始启动2.5 启动完后查看进程2.6 建集群 1.单机Redis部署 Linu…...

html iframe 框架有哪些优缺点?

目录 前言&#xff1a; 用法&#xff1a; 理解&#xff1a; 优点&#xff1a; 嵌套外部内容&#xff1a; 独立性&#xff1a; 分离安全性&#xff1a; 跨平台兼容性&#xff1a; 方便维护&#xff1a; 缺点&#xff1a; 性能开销&#xff1a; 用户体验问题&#xf…...

git 版本管理

标签管理 git tag: 标签的操作 用于给某次提交打个标签 命令&#xff1a;git tag B08P09 为当前提交打上 B08P09 的标签 命令&#xff1a;git tag B08P09 ab1591eb4e06c1e93fdd50126b9fab8a88d89155 为这个节点打上 B08P09 的标签 命令&#xff1a;git tag -a <tagname>…...

hyperf框架接入pgsql扩展包

文章目录 hyperf2.2安装 hyperf3.0安装 配置 环境版本支持 hyperf框架版本php版本database版本2.2>7.4~2.2.03.0>8.1~3.0.0 hyperf2.2 https://github.com/hyperf/database-pgsql-incubator 安装 hyperf/database 组件版本必须大于等于 v2.2.26 composer require hype…...

【算法训练-动态规划 五】【二维DP问题】最大正方形

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【动态规划】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...