【Qt】2.Qt坐标系、信号和槽、Lambda表达式

news2024/9/20 8:37:32

目录

Qt坐标系

信号和槽

需求

优点

自定义信号

自定义槽函数

触发自定义信号

代码

main.cpp

widget.h

widget.cpp

teachar.h

teachar.cpp

student.h

student.cpp

结果

重载

解决方法

信号和槽拓展

断开信号和槽

触发多个槽函数

Lambda表达式

[]

()

{}

mutable

返回值

代码

Qt坐标系

从左上角为(0,0)

  • x:横轴向右

  • y:竖轴向下

信号和槽

需求

点击按钮,关闭窗口。

/*
 * 参数1:信号的发送者
 * 参数2:发送的信号
 * 参数3:信号的接收者
 * 参数4:处理的槽函数
 */
connect(myBtn,&MyButton::clicked,this,&MyWidget::close);

优点

松散耦合。一个事件触发另一个事件。

自定义信号

返回值:void

需要声明,不需要实现

可以有参数

自定义槽函数

返回值:void

需要声明,需要实现

可以有参数

触发自定义信号

emit

代码

main.cpp

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "teachar.h"
#include "student.h"

class Widget : public QWidget
{
    Q_OBJECT

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

    Teachar *zt;
    Student *st;

    void classIsOver();
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"

//需求:创建两个类 Teacher类  Student类
//下课后,老师Teachar zt 发出一个信号 饿了
//学生响应信号Student st 处理信号的槽函数 请客吃饭

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    zt=new Teachar(this);
    st=new Student(this);

    //连接老师和学生
    connect(zt,&Teachar::hungry,st,&Student::treat);

    //下课
    classIsOver();
}

void Widget::classIsOver(){
    //触发老师饿了的信号
    //老师饿了的信号属于自定义信号,触发自定义信号关键字emit
    emit zt->hungry();
}

Widget::~Widget()
{
}

teachar.h

#ifndef TEACHAR_H
#define TEACHAR_H

#include <QObject>

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

signals:
    //自定义信号,需要写到signals下
    //返回类型,必须是void
    //信号只需要声明,不需要实现
    //信号可以有参数,可以重载
    void hungry();
};

#endif // TEACHAR_H

teachar.cpp

#include "teachar.h"

Teachar::Teachar(QObject *parent) : QObject(parent)
{

}

student.h

#ifndef STUDENT_H
#define STUDENT_H

#include <QObject>

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

signals:

public slots:
    //自定义槽函数
    //高版本可以写到public下或者全局函数
    //槽函数返回值void
    //槽函数需要声明,也需要实现
    //槽函数也可以有参数,可以发生重载
    void treat();
};

#endif // STUDENT_H

student.cpp

#include "student.h"
#include <QDebug>

Student::Student(QObject *parent) : QObject(parent)
{

}

void Student::treat(){
    qDebug() << "请吃饭";
}

结果

重载

当自定义信号和槽出现重载的时候,原先写法失效,因为执行的函数地址不明确。

解决方法

利用函数指针来明确指向哪个函数的地址。

QString转char *:toUtf8转QByteArray类型,再利用data转成char *。

信号和槽拓展

  1. 信号可以连接信号

  2. 信号和槽可以断开,disconnect

  3. 一个信号可以触发多个槽函数

  4. 多个信号可以连接同一个槽函数

  5. 信号和槽的参数必须一一对应,参数的个数不一定一一对应。信号的参数个数可以多于槽函数的参数个数,反之不可以,但是必须类型一一对应。

断开信号和槽

disconnect(zt,noTeacharSignal,st,noStSlot);

触发多个槽函数

//触发无参 信号和槽,信号连接信号
void(Teachar::*noTeacharSignal)(void)=&Teachar::hungry;
void(Student::*noStSlot)(void)=&Student::treat;
connect(btn,&QPushButton::clicked,zt,noTeacharSignal);
connect(btn,&QPushButton::clicked,this,&Widget::close);//一个信号可以连接多个槽函数
connect(zt,noTeacharSignal,st,noStSlot);

Lambda表达式

[](){}();

[]

[=]:值传递,推荐

[&]:引用传递,不推荐

()

参数

{}

函数实现体

mutable

改变值传递的内部变量。

返回值

[]()->类型{}();

代码

zt=new Teachar(this);
st=new Student(this);

//连接老师和学生,有参数
void(Teachar::*teacharSignal)(QString)=&Teachar::hungry;
void(Student::*stSlot)(QString)=&Student::treat;
connect(zt,teacharSignal,st,stSlot);

//[=](){}(),用到最频繁
QPushButton *btn2=new QPushButton("aaa",this);
[=](){
    btn2->setText("bbb");
    btn2->move(100,100);
    btn->setText("ccc");
}();

//mutable关键字,用于修改值传递的变量进行修改
QPushButton *myBtn=new QPushButton("myBtn",this);
QPushButton *myBtn2=new QPushButton("myBtn2",this);
myBtn->move(10,10);
myBtn2->move(10,40);
int num=10;
connect(myBtn,&QPushButton::clicked,this,[num]()mutable{num=100+10;qDebug()<<num;});
connect(myBtn2,&QPushButton::clicked,this,[=](){qDebug()<<num;});
qDebug()<<num;

//返回值
int ret=[]()->int{return 10000;}();
qDebug()<<"ret="<<ret;

QPushButton *btn3=new QPushButton("btn3",this);
btn3->move(10,70);
//无参按钮调用有参
connect(btn3,&QPushButton::clicked,this,[=](){
    zt->hungry("帝皇蟹");
});
//点击按钮,关闭窗口
connect(btn3,&QPushButton::clicked,this,[=](){
    this->close();
});

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构与算法】DP路径问题

问题&#xff1a;最小路径和 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例 1&#xff1a; 输入&#xff1a;grid [[1,3,1],[1,5,…

二叉树28:二叉搜索树的最近公共祖先

主要是我自己刷题的一些记录过程。如果有错可以指出哦&#xff0c;大家一起进步。 转载代码随想录 原文链接&#xff1a; 代码随想录 leetcode链接&#xff1a;235. 二叉搜索树的最近公共祖先 题目&#xff1a; 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。…

对于Go 语言的进阶与依赖管理| 青训营笔记

一.Go 语言进阶与依赖管理 1.1并发和并行 Go可以充分发挥多核优势&#xff0c;高效运行。 多线程程序在单核心的 cpu 上运行&#xff0c;称为并发&#xff1b; 多线程程序在多核心的 cpu 上运行&#xff0c;称为并行。 并发与并行并不相同&#xff0c;并发主要由切换时间片…

2016年专业408算法题

文章目录0 结果1 题目2 思路2.1 思路1&#xff08;较优解&#xff1a;排序&#xff09;2.2 思路2&#xff08;最优解&#xff1a;类快排思想排序&#xff09;附录0 结果 较优解&#xff1a; 最优解&#xff1a; 1 题目 2 思路 为了使&#xff5c;n1−n2&#xff5c;&#…

1.2.3存储结构:主存编址计算、主存编址的过程、存储单元、编址内容、存储总容量

1.2.3存储结构&#xff1a;主存编址计算、主存编址的过程、存储单元、编址内容、存储总容量主存编址的过程存储单元主存编址存储单元编址内容存储总容量例题主存编址的过程 计算机是一个机器&#xff0c;它能够识别的是机器语言&#xff0c;电器信号。因此计算机当中所有的数据…

英语学习 2

1 词汇积累 1、imply and infer 暗示和推断 2、indicate 显示、指出 3、outgoing 外向的 4、sympathy 同情心 5、sympathetic 有同情心的 6、evolution 进化 8、agreement 一致 10、resourceful 足智多谋的 11、appear 似乎 12、manufacturers 厂家、制造商 13、toilet paper …

linux定时器crond使用方式简介

文章目录一、简介二、cron.d下文件示例三、被调用的脚本文件四、检查脚本是否执行五、遇到的脚本未执行的情况一、简介 一般来说在/etc目录下&#xff0c;有5个以cron开头的目录&#xff0c;分别是/etc/cron.hourly&#xff0c;/etc/cron.daily&#xff0c;/etc/cron.weekly&a…

java泛型6

到底何时使用泛型方法&#xff1f;何时使用类型通配符呢&#xff1f;大多数时候都可以使用泛型方法来代替类型通配符。 这种场景下效果一样。 上面方法使用了泛型形式&#xff0c;这时定义泛型形参时设定上限&#xff08;其中E是Collection接口里定义的泛型&#xff0c;在该接…

搭建企业知识库的意义

当客户跟你达成合作关系后&#xff0c;需要持续的关系维护&#xff0c;在一定的销售点&#xff0c;定期和客户沟通&#xff0c;据调查&#xff0c;赢得一个新客户的成本可能是保留一个现有客户的5到25倍&#xff0c;作为营销策略&#xff0c;客户服务支持必须满足他们的期望。建…

Java---微服务---Seata的部署和集成

Seata的部署和集成一、部署Seata的tc-server1.下载2.解压3.修改配置4.在nacos添加配置5.创建数据库表6.启动TC服务二、微服务集成seata1.引入依赖2.修改配置文件三、TC服务的高可用和异地容灾1.模拟异地容灾的TC集群2.将事务组映射配置到nacos3.微服务读取nacos配置一、部署Sea…

PEM格式RSA密钥解析(二)

PEM格式RSA密钥解析&#xff08;二&#xff09; RSA密钥参数解析 上一部分讲解了将Base64编码的密钥数据转换成hex格式数据&#xff0c;本章将介绍如何获从转码后的数据中获取RSA密钥的相关参数。 根据 RSA 密钥语法中的结构对私钥解析结果如下&#xff1a; 上一节转码后的私…

暗月ACK靶场 WP

环境搭建 https://mp.weixin.qq.com/s/VB4elHdrHNCmPDP_ktcLRg https://www.bilibili.com/video/BV1264y187St?spm_id_from333.1007.top_right_bar_window_history.content.click 按照文章拓扑根据实际情况搭建好&#xff0c;web2的其中一个网卡需要自己调一下ip 1、把 12s…

第五届字节跳动青训营 前端进阶学习笔记(十)Webpack基础

文章目录前言什么是Webpack1.Webpack概述2.Webpack基本使用Webpack打包核心流程1.webpack需要做的事情2.Webpack的使用3.处理CSS4.接入babel5.生成HTML6.HMR7.Tree-ShakingLoader1.Loader的主要特性2.常见Loader总结前言 课程重点&#xff1a; 什么是WebpackWebpack打包核心流…

本地启动打包后文件

本地启动打包后文件在 vs code 扩展中安装 Live Server配置 Live Server在 vs code 扩展中安装 Live Server 点击安装 Live Server 配置 Live Server VS Code setting.json 中配置 Vue/React 打包后文件夹 build/dist 为服务器的根目录 "liveServer.settings.root"…

AOP实例 – 环绕增强 日志记录

AOP实例 – 环绕增强 日志记录需求&#xff1a;记录图书的service层的日志操作&#xff0c;到数据库1. 创建商品日志记录表 Book_Log2. 完成日志记录表的插入逻辑3. 环绕增强搜集日志记录参数&#xff0c;并测试4. 环绕增强调用日志记录表的插入逻辑&#xff0c;完成日志记录功…

【目标检测论文解读复现NO.29】基于YOLO-ST的安全帽佩戴精确检测算法

前言此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c;…

Spire.Barcode 5.1.0 for Java Patch

Spire.Barcode for Java是专门为开发人员设计的专业条码组件&#xff0c;用于在 Java 应用程序&#xff08;J2SE 和 J2EE&#xff09;上生成、读取和扫描 一维和二维条码。开发人员和程序员可以使用 Spire.Barcode 快速轻松地将企业级条码格式添加到他们的 Java 应用程序中。需…

【数字逻辑】逻辑函数式化简为其他形式

以 F&#xff08;A,B,C&#xff09;ABA‾CF&#xff08;A,B,C&#xff09; AB\overline{\rm A}CF&#xff08;A,B,C&#xff09;ABAC 为例&#xff0c;说明如何将与或式转换为其它类型的表达式。

CE认证和CCC认证区别?

CE认证和CCC认证区别? 参考链接:https://baijiahao.baidu.com/s?id=1728784934635704528&wfr=spider&for=pc CE认证和CCC认证有什么区别? 我发现我的很多朋友对此并不了解。 同时我发现很多产品在很多产品包装上都通过了CCC和CE认证,所以可能会引起没有做过产品…

硬件 -CPU工作原理

1.地址空间一个处理器能够访问&#xff08;读写&#xff09;的存储空间有限&#xff0c;我们称空间为地址空间&#xff0c;一般来说N位地址总线的处理器的地址空间是2的N次方。CPU从内存中取数据&#xff0c;先发地址&#xff0c;内存收到后&#xff0c;发送地址所在的数据。2.…