lambda qt 参数 槽函数_Qt界面开发(3)

2023-11-16

参考

QT界面开发_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com

接:

juliar:Qt界面开发(1)

juliar:Qt界面开发(2)

一.带参数的信号

前面关于信号signal,我们了解到:

//signals是Qt扩展的关键字
/*信号必须有signals关键字来申明
* 信号没有返回值,但可以有参数
* 信号就是函数的声明,只需声明,无需定义
* 使用:emit mySignal();
*信号可以重载
*/

那下面我们就来看,带参数的信号是怎么样的?

1.首先在subwidget.h中声明(无需定义)一个带两个参数的重载信号函数mySignal

void mySignal(int,QString); //一个整型,一个字符串

2.点击F4,到实现部分,在subwidget.cpp中加入发送的信号:

emit mySignal(250,"我是子窗口");

3.因为信号是给槽函数传参的,所以相应的槽函数也要有两个相应参数,在mainwindow.h定义:

void dealSlot(int,QString);

4.接下来在mainwindow.cpp中进行connect处理

connect(&w,&subWidget::mySignal,this,&MainWindow::dealSlot); 

5.mainwindow.cpp中实现槽函数,要打印,需要加入头文件#include <QDebug> (用法同c++中的cin、out)

当信号出现重载时,产生二义性,下面先复习函数指针的用法

函数指针的用法:
对于函数
void fun(int)
{
}
void (*p)(int)=fun //即函数返回值类型 (* 指针变量名) (函数参数列表);

在mainwindow.cpp中使用函数指针的方法进行信号处理

    //处理子窗口的信号
    void(subWidget::*funSignal)()=&subWidget::mySignal;//&subWidget::mySignal <==> funSignal
    connect(&w,funSignal,this,&MainWindow::dealSub);

    void(subWidget::*testSignal)(int,QString)=&subWidget::mySignal;  //&subWidget::mySignal <==> testSignal
    connect(&w,testSignal,this,&MainWindow::dealSlot); //带参数的信号

此外,如果打印的是中文,则需要进行以下编码转换

void MainWindow::dealSlot(int a,QString str)
{
     //str.toUtf8() -> 字节数组
    //...data() -> QByteArray ->char*
    qDebug()<<a<<str.toUtf8().data(); //F1查看其用法:要将中文转成utf8的类型,转化成了char *
}

等到执行一轮循环(切换到子窗口+切换到主窗口),完成,打印出“250 I am main window”可见程序执行正确。

以上是Qt5的代码,若是在Qt4中,作以下修改

public slots: //Qt4槽函数必须有slots关键字来修饰
    void myslot(); //与released对应,是一个无参数,无返回值的函数
    void changeWin(); //用来隐藏自己,显示对方
    void dealSub(); //处理子窗口
    void dealSlot(int,QString);
    //Qt4信号连接
    //Qt4槽函数必须有slots关键字来修饰
    connect(&w,SIGNAL(mysignal()),this,SLOT(dealSub()));

    connect(&w,SIGNAL(mysignal(int,QString)),this,SLOT(dealslot(int,Qstring)));
    //SIGNAL SLOT 将函数名字->字符串不进行错误检查,即函数名错误也编译时也不报错,生成时提示

同样可以。

二.Lambda表达式

Lambda表达式(匿名函数对象)是c++11增加的新特性,在Qt中配合信号一起使用,非常方便,需要在项目文件中添加

CONFIG += C++11  //为了用lambda表达式

Lambda表达式优点:不需要重复调用常函数、连接者

Lambda表达式语法:

    QPushButton *b4 = new QPushButton(this);
    b4->setText("Lambda");
    b4->move(150,150);
    int a=10,b=100;
    connect(b4,&QPushButton::released,
            [=]()   mutable
                    //[]代表函数的开始,用于把外部变量传递进来,
                    //=指把外部所有局部变量及类中成员以值方式传递进来,要比引用&安全
                    //this:类中所有成员以值传递方式
                    //&:把外部所有局部变量,以引用方式传递()不包括类中成员
            {       //()指函数的参数、{}代表函数体
                b4->setText("123");  //本质上没有改b4,只改了其显示内容
                qDebug()<<"11111";
                qDebug()<<a<<b; //但是a、b这样的值不能在这儿进行改变(默认是只读),否则会报错,要想对a进行修改,需加关键字mutable(可变的)
                a=11;
            }
            );

三.坐标系统

新建空文件:

mywidget.cpp

#include "mywidget.h"
#include<QPushButton>

myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
{
    /* 对于父窗口(主窗口),坐标系统相对于屏幕
     * 原点:相对于屏幕左上角
     * x:往右递增
     * y:往下递增)
    */
    move(100,100);

    /* 对于子窗口,坐标系统相对于父窗口
     * 原点:相对于窗口空白区域(不包括边框)
     * x:往右递增
     * y:往下递增)
    */
    QPushButton *b1=new QPushButton(this);
    b1->move(100,100);
    b1->setText("^_^");
    b1->resize(200,200);

    QPushButton *b2=new QPushButton(b1);
    b2->move(10,10);
    b2->setText("@_@");
    //b2->resize(100,100);

}

myWidget::~myWidget()
{

}

以上两个按钮b1、b2都是通过new为其动态分配内存空间的,按c++,使用完毕要对其进行内存空间释放,否则容易造成内存泄露。在Qt中,只要1.指定了父对象(有对象树)、2.直接或间接继承于QObject,则自动进行内存释放。

2020.12.28

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

lambda qt 参数 槽函数_Qt界面开发(3) 的相关文章

  • 自监督学习-MoCo-论文笔记

    论文 Momentum Contrast for Unsupervised Visual Representation Learning CVPR 2020 最佳论文提名 用动量对比学习的方法做无监督的表征学习任务 动量的理解即是指数移动平
  • 初学者写一个程序(一)(PyCharm配置Python解释器)

    5 PyCharm配置Python解释器 1 首先安装 PyCharm 完成之后 打开它会显示如下所示的界面在file中也有settings 点击后一样的操作 图六 在此界面中 可以手动给 PyCharm 设置 Python 解释器 点击图
  • 指数平滑法(Exponential Smoothing,ES)

    目录 1 指数平滑 2 一次指数平滑预测 又叫简单指数平滑 simple exponential smoothing SES 2 1 定义 2 2 例题 3 二次指数平滑法 Holt s linear trend method 3 1 定义
  • torch.nn.modules.module.ModuleAttributeError: ‘DataParallel‘ object has no attribute ‘step‘

    错误位置定点 解决方法
  • react学习—属性默认值和类型验证

    属性默认值和类型验证 一 属性默认值 1 函数组件属性默认值 2 类组件默认属性值 二 属性类型验证 1 常见值类型 2 是否必传isRequired 3 其它类型验证 4 自定义验证 一 属性默认值 通过一个静态属性defaultProp
  • 基础算法matlab

    常用算法 knn knn clc close all clear training mvnrnd 2 2 eye 2 50 mvnrnd 2 2 2 eye 2 50 mvnrnd 2 2 2 eye 2 50 group ones 50
  • Comparable和Comparator的区别以及Lambda表达式实现

    Comparable和Comparator的区别 1 comparable里面的ComparaTo 是TreeSet和TreeMap里面add 与put 方法里面调用对象的ComparaTo 通过返回值 来确定它 是否存在or顺序 他是内置
  • 计算机二级证书免费发到学校,计算机二级证书去哪里领取

    随着计算机等级考试成为了当代大学生必考的考试之一 越来越多的同学都加入到考试大军 通过了计算机二级考试 证书如何领取呢 下面是小编整理的详细内容 一起来看看吧 计算机二级证书领取方法 1 一般情况下是考试结束后50个工作日左右出成绩及出证
  • echarts 中 symbol 自定义图片

    首先我使用的技术框架的VUE 当然该方法在其他框架也是适用的 这点大家注意一下 在官方文档里面 修改标记的图形 symbol 的方法有三种 一 ECharts 提供的标记类型有 circle rect roundRect triangle
  • .NET C#基础(5):结构体 - 高性能代码的基石

    0 文章目的 本文面向有一定 NET C 基础知识的学习者 介绍C 中结构体定义 使用以及特点 1 阅读基础 了解C 基本语法 了解 NET中的栈与托管堆 2 值类型 2 1 NET的两大类型 在 NET中 所有类型都是object类型的子
  • Excel行高、列宽怎么调整?

    在日常工作中 经常会需要用到Excel表格 如果打开的Excel表格行高列宽不是我们想要的 要怎么调节到合适的大小呢 方法一 打开Excel表格 按 Ctrl A 快捷键 选中全部表格 或者点击表格左上角 行号和列标交汇处的灰色小三角 也可
  • CEPH PG incomplete状态修复

    某运营商的Kubernetes项目物理机停机维护 重启后Kubernetes部分pod无法挂载PVC 请求超时 该Kubernetes集群的后端存储使用ceph rbd块存储 检查ceph集群状态异常 root ceph node01 ce
  • Nacos

    一 Nacos Spring Cloud Alibaba https spring io projects spring cloud alibaba Nacos 官网 https nacos io zh cn docs what is na
  • openGL library下载地址

    GLUT下载页面 http www opengl org resources libraries glut glut downloads php GLUT for Win32下载页面 http www xmission com nate g
  • linux系统虚拟机安装centos7

    一 安装 第一步 下载安装VMware Fusion Mac版本下载后双击安装 这里不做过程记录 第二步 下载CentOS 7安装包 CentOS 7 x86 64 DVD 1810 iso 本文不提供下载地址 第三步 在VMware Fu
  • Vue中使用render 封装el-table解决多级表头自定义模板

    vue中多数情况下使用template封装组件逻辑清晰结构简单 但是在某些情况下 比如非常简单的组件 vue render简单解析或者template无法解决某些场景下 使用完全javascirpt能力就显得尤为重要 文章目录 使用rend
  • VB.Net常用的正则表达式(实例)

    d 非负整数 正整数 0 0 9 1 9 0 9 正整数 d 0 非正整数 负整数 0 0 9 1 9 0 9 负整数 d 整数 d d 非负浮点数 正浮点数 0 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1
  • 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数---百度笔试题

    题目 给定一个存放整数的数组 重新排列数组使得数组左边为奇数 右边为偶数 要求 空间复杂度O 1 时间复杂度为O n 我自己写了一下 之前写的那个不对 现在重写了 时间复杂度达到O n void swap int a int i int j
  • python数据可视化-折线图

    可通过ab173 com查看json数据 导入json import json 处理数据 美国为例 f us open D 桌面 折线图数据 美国 txt r encoding UTF 8 us data f us read 美国的全部内容

随机推荐

  • VMware17虚拟机安装及Linux系统搭建(详细版)

    作者简介 大家好 我是小杨 个人主页 小杨 的csdn博客 希望大家多多支持 一起进步呀 前言 VMware是一个虚拟PC的软件 可以在现有的操作系统上虚拟出一个新的硬件环境 相当于模拟出一台新的PC 进行计算机的管理 软件安装 文件的使用
  • 这十个步骤让你的 App 避规ios 4.3被拒问题

    4 3 垃圾应用 请不要为同一个 App 创建多个套装 ID 如果您的 App 针对特定位置 运动队 大学等存在不同版本 请考虑提交单个 App 并提供 App 内购买以提供差异功能 同时 请避免继续在已有大量类似 App 的类别下进行开发
  • kubectl应用

    文章目录 kubectl用法概述 kubectl输出格式 kubectl操作示例 kubectl用法概述 kubectl命令语法 kubectl command TYPE NAME flags 其中 command TYPE NAME fl
  • 如何计算内存大小

    对电子产品 存储介质厂家来说 是按进率1000来计量的 即1000B 1KB 1000KB 1MB 1000MB 1GB 也就是为什么硬盘分区后 会造成缩水 比如80G硬盘实际等于76G 的原因 因为系统是按1024进率来进行分区的 注 我
  • 多文件编程

    文章目录 什么是多文件编程 lt gt 与 多文件编程方法 变量重复定义与头文件重复包含 变量重复定义 头文件重复包含 为什么要避免重复包含 如何解决 1 ifndef 2 pragma once 小总结 什么是多文件编程 多文件编程 指的
  • vite postcss

    PostCSS PostCSS是一款使用JavaScript插件对CSS实现转换的工具 PostCSS拥有非常强大的插件 典型的比如autoprefixer cssnext css modules等 PostCSS插件的处理方式类似CSS预
  • CSS:基本选择器中的ID选择器和class选择器的区别

    ID选择器 通过标签的id名称来选择标签 id 类选择器 class选择器 选择一个类别 className 区别 1 ID 选择器的是以井号 开头来定义的 类 选择器是以点 来定义的 2 ID 选择器在 HTML 中是可以通过 id 属性
  • 2_Nginx 语法

    文章目录 一些说明 配置静态资源服务器 常用指令 一些说明 指令 指令块 指令以分号结尾 一条指令可以有一个或多个参数 参数之间以空格分隔 例如 server name 指令块可以有名字或者没有名字 include 允许组合多个配置文件 以
  • 面经(一)广州保伦电子有限公司校招宣讲面经

    前言 本章主要讲述我曾参加广州保伦有限公司的学校宣讲并笔试的经历 一 经历概述 宣讲前 在得知该公司会来我们学校进行宣讲时 我看到有招聘Java开发职位 就马上决定参加该公司的宣讲 因为我们学校是最后一次宣讲的地方 自己心里也知道人肯定是招
  • Design Compiler (七)——环境、设计规则和面积约束

    本文如果有错 欢迎留言更正 此外 转载请标明出处 http www cnblogs com IClearner 作者 IC learner 本文的主要内容是讲解 约束针对的是逻辑综合下的约束 而实战部分则是在DC的拓扑模式下进行 环境属性的
  • image not loaded  try to open it externally to fix format problem

    image not loaded try to open it externally to fix format problem 图片没有加载 请从外部打开图片以解决格式问题 由于项目是直接复制过来的 图片从外部打开显示为空 直接全部替换重
  • 编码规范(三)----静态分析工具PMD

    一 简介 1 1 什么是静态代码分析 静态代码分析是指无需运行被测代码 仅通过分析或检查源程序的语法 结构 过程 接口等来检查程序的正确性 找出代码隐藏的错误和缺陷 如参数不匹配 有歧义的嵌套语句 错误的递归 非法计算 可能出现的空指针引用
  • 形象的理解TCP协议为什么要“三次握手”

    我们先来看看专业的解读是怎么简单描述 三次握手 的 以下图片来自百度百科 如果你看完一脸懵圈 不妨想想三次握手的目的 那就是确保客户端和服务器能够正常通讯 当然 本文只是从非专业的角度解释为何TCP建立连接的三次握手就能保证正常通讯 为何不
  • Java创建对象数组出现空指针报错

    public static void main String args teacher d new teacher 2 System out println d 0 其中创建的数组d的内存状态为空 输出数组d其中一个元素是null 即使随便
  • 你了解模糊测试(fuzz testing)吗?

    模糊测试 fuzz testing 是一类安全性测试的方法 说起安全性测试 大部分人头脑中浮现出的可能是一个标准的 黑客 场景 某个不修边幅 脸色苍白的年轻人 坐在黑暗的房间中 正在熟练地使用各种工具尝试进入某个系统 这种由安全人员 模拟黑
  • 图像&视频编辑工具箱MMEditing使用示例:图像超分辨率(super-resolution)

    MMEditing的介绍及安装参考 https blog csdn net fengbingchun article details 126331541 这里给出图像超分的测试代码 论文 Learning Continuous Image
  • go 流媒体服务搭建-01

    这里写自定义目录标题 go 流媒体服务搭建 01 go 流媒体服务搭建 01 新建go 项目 配置go 版本1 19 新增main go package main func main 新增go mod 文件 go mod init mym7
  • C语言之路---三大结构

    目录 1 选择结构 1 1 if else语句 1 2 switch case 语句 1 3 条件运算符 2 循环结构 2 1 whi
  • 直接修改数据库表数据

    直接修改数据库表中的数据 1 写SQL语句 select from 表名 for update 如下图所示 写好SQL后点击执行按钮或者直接按F8 2 执行完SQL后选择行上的按钮 让行信息变成可编辑状态 如下图所示 3 可按增加或者删除一
  • lambda qt 参数 槽函数_Qt界面开发(3)

    参考 QT界面开发 哔哩哔哩 干杯 bilibili www bilibili com 接 juliar Qt界面开发 1 juliar Qt界面开发 2 一 带参数的信号 前面关于信号signal 我们了解到 signals是Qt扩展的关