QT学习_02_Lambda表达式——槽函数的正确打开方式

2023-10-26

1 带参数的信号

假设发送的信号带参数

信号是可以重载的,我用同一个函数名称,一个带参数,一个不带参数,在点击“切换到主窗口”按钮的时候,同时发射这两个信号。

subwidget.h

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include <QPushButton>

class Subwidget : public QWidget
{
    Q_OBJECT
public:
    explicit Subwidget(QWidget *parent = nullptr);
    void sendsignal();
signals:
    /* 信号必须有signals关键字来声明
     * 信号没有返回值,但可以有参数
     * 信号就是函数的声明,只需声明,无需定义
     * 使用 emit mysignal();
     * 信号可以重载,取同一个名字,只是参数不同而已
     */
     void mysignal();
     // void mysignal(int a, QString  str); // × 声明函数是不用写形参名,只写类型
     void mysignal(int, QString);   // ▲ 新增的代码

public slots:

private:
    QPushButton b;
};

#endif // SUBWIDGET_H

subwidget.cpp

#include "subwidget.h"

Subwidget::Subwidget(QWidget *parent) : QWidget(parent)
{
    this->setWindowTitle("子窗口");
    b.setParent(this);
    b.setText("切换到主窗口");

    connect(&b,&QPushButton::clicked,this,&Subwidget::sendsignal);
    resize(400,300);
}

void Subwidget::sendsignal(){
    emit mysignal();
    emit mysignal(250,"我是子窗口"); // 新增的代码
}

信号函数与槽函数的参数和返回值要一致因此,接收信号的主窗口,需要添加一个带参数的槽函数。

另外,由于mysignal是给重载的信号,存在二义性,所以不能延用原来的方式,需要定义函数指针。

mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QPushButton>
#include "subwidget.h"

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = nullptr);
    ~MyWidget();
    void changewin();
    void dealsub();
    void dealslot(int,QString); // ▲ 新增带参数的槽函数的声明
private:
    QPushButton mainwinb;
    Subwidget subwin;
};
#endif // MYWIDGET_H

mywidget.cpp

#include "mywidget.h"
#include <QDebug>
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    mainwinb.setParent(this);
    mainwinb.setText("切换到子窗口");
    mainwinb.move(100,100);
    this->setWindowTitle("主窗口");

    connect(&mainwinb,&QPushButton::released,this,&MyWidget::changewin);


    // connect(&subwin,&Subwidget::mysignal,this,&MyWidget::dealsub);
    // mysignal 是 Subwidget这个类自定义的信号
    // dealsub  是 MyWidget这个类自定义的槽函数

    // ▲ 注意!!!!
    // 由于mysignal是重载的,所以存在二义性,在connect函数中不能在使用原来的方式
    // 因此需要定义函数指针

    // 没参数的mysignal
    void (Subwidget::*mysignal_without_para)() = &Subwidget::mysignal;
    connect(&subwin,mysignal_without_para,this,&MyWidget::dealsub);

    // 有参数的mysignal
    void (Subwidget::*mysignal_with_para)(int, QString) = &Subwidget::mysignal;
    connect(&subwin,mysignal_with_para,this,&MyWidget::dealslot);   // ▲ 新增的槽函数不是重载的,不存在二义性,所以可以延用原来的调用方式

    resize(400,300);
}

MyWidget::~MyWidget()
{
}

void MyWidget::changewin(){
    // 子窗口显示
    subwin.show();
    this->hide();

}

void MyWidget::dealsub(){
    // 子窗口显示
    subwin.hide();
    this->show();

}

// ▲ 新增带参数的槽函数定义
void MyWidget::dealslot(int a, QString str){

    qDebug() << a << str;
}

运行结果

2 Lambda表达式——槽函数的正确打开方式

Lambda表达式,是C++11增加的新特性。在Qt配合信号一起使用,非常方便

要使用Lambda表达式,项目文件需要添加:CONFIG += C++11。

版本新点的Qt生成项目时自动会生成

 Lambda表达式,可以理解成:匿名函数对象

新添加一个按钮来说明Lambda表达式的好处

mywidget.cpp

#include "mywidget.h"
#include <QDebug>
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    mainwinb.setParent(this);
    mainwinb.setText("切换到子窗口");
    mainwinb.move(100,100);
    this->setWindowTitle("主窗口");

    connect(&mainwinb,&QPushButton::released,this,&MyWidget::changewin);


    // connect(&subwin,&Subwidget::mysignal,this,&MyWidget::dealsub);
    // mysignal 是 Subwidget这个类自定义的信号
    // dealsub  是 MyWidget这个类自定义的槽函数

    // 由于mysignal是重载的,所以存在二义性,在connect函数中不能在使用原来的方式
    // 因此需要定义函数指针

    // 没参数的mysignal
    void (Subwidget::*mysignal_without_para)() = &Subwidget::mysignal;
    connect(&subwin,mysignal_without_para,this,&MyWidget::dealsub);

    // 有参数的mysignal
    void (Subwidget::*mysignal_with_para)(int, QString) = &Subwidget::mysignal;
    connect(&subwin,mysignal_with_para,this,&MyWidget::dealslot); 

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

QT学习_02_Lambda表达式——槽函数的正确打开方式 的相关文章

  • Qt - 获取互联网上托管的网页的源代码(HTML 代码)

    我想获取网页的源代码 HTML 例如StackOverflow的主页 这是我到目前为止编写的代码 QNetworkAccessManager manager QNetworkReply response manager get QNetwo
  • Mac 上的 Qt — 如何访问帮助菜单中的“搜索”

    我正在将我的 Qt 应用程序移植到 Mac OS X 在 Windows Linux 上 我使用 QLineEdit 在帮助菜单中提供搜索功能 In Mac OS X I saw something like this is built i
  • 静态变量中的 qt tr()

    我在 qt 中的翻译方面遇到问题 我的项目中的所有翻译都工作正常 但有一个翻译位于类的静态变量中 相应部分代码如下 头文件类似于这样 typedef struct int type QString problematicString inf
  • Qt Creator 2.8.1 Qt 5.1.1 Qt Designer Linux 显示新窗体

    我是 Qt 的初学者 所以希望这是一个容易回答的问题 我有相当多的 C 经验 这部分不是问题 我的应用程序的目的是进行代码生成 最初是为类制作头文件和实现文件 我非常喜欢 Code Blocks 上的类向导 但我认为我可以做更多的事情 我有
  • 使用 Qt 的网络服务

    我正在寻找使用 Qt 服务器端 实现 Web 服务的代码 如果您有任何信息 我将不胜感激 Regards 您可以使用libqxt http libqxt bitbucket org doc 0 6 qxtweb html实现服务器端Web服
  • 常量类成员、赋值运算符和 QList

    请确认我是否正确并告诉我是否有更好的解决方案 我了解具有常量成员的对象 例如int const width 无法由编译器隐式创建的合成赋值运算符处理 但是 QList 我想 std list 也是如此 需要一个有效的赋值运算符 因此 当我想
  • QWebSocketServer - 不释放内存

    首先 我在安全 websocket 服务器应用程序上运行 valgrind 并发现了一个问题 在 Qt Memcheck 中我必须检查 外部错误 看到它 一些字节是肯定输了 指着我的main就在我的地方QCoreApplication ex
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • 包含 Qt 标头的正确方法是什么?

    到目前为止我知道几种方法 includeQt 类 include
  • 将 C++ 代码(本机客户端)移植到浏览器(Web 应用程序)

    我有一个使用 Qt creator SDK 编写的 C 模块 我想将此代码移植到任何网页上运行 而不会对最终用户损害源代码 用户应该能够在任何浏览器 Chrome Firefox Safari Explorer 上看到此模块的输出 而无需安
  • Qt 创建者 4.8.4。 Windows 7 - 64 位安装

    我在 QT 方面遇到了一些困难 我需要在学校使用它来完成一些 GUI 应用程序 我最近完成了以下步骤 1 mingw get inst 20120426 exefrom 来源锻造 http sourceforge net projects
  • 如何将flex和bison与Qt项目集成?

    我正在 git 源代码控制下使用 Qt4 制作 GUI 程序 Github页面 https github com vinayak garg dic sim 项目的一小部分需要扫描和解析 所以我想在项目中使用flex和bison 我能想到3种
  • QMessageBox::about 可以根据标题长度调整大小吗?

    我想创建一个简单的 关于 对话框 但注意到QMessageBox about不会根据标题的长度调整其大小 由于字体较大 标题通常会更长 至少在我的桌面环境中 仅根据内容调整其大小 有没有办法确保对话框足够大以显示所有标题 我当然可以向 ab
  • QFileDialog 作为 TableView 的编辑器:如何获取结果?

    我正在使用一个QFileDialog作为某些专栏的编辑QTableView 这基本上有效 对一些焦点问题取模 请参阅here https stackoverflow com questions 22854242 qfiledialog as
  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上
  • Qt - 意外的 GDB 退出

    我正在尝试开发一个应用程序 该应用程序创建图像并使用双线性插值填充颜色像素 然后显示它 到目前为止我的代码如下 include
  • Qt:关闭期间线程仍在运行时 qthread 被销毁

    我有一堂课 class centralDataPool public QObject Q OBJECT public centralDataPool QObject parent 0 centralDataPool commMonitor
  • 仅当从 Qt 连接时网页返回 HTTP 406 错误

    我有一个测试页面设置http mlecturedownload com test qt php http mlecturedownload com test qt php有以下代码
  • Qt 码头调整大小事件

    有没有办法在 Qt 中捕捉码头的调整大小事件 我需要能够检测到扩展坞何时调整大小 而不仅仅是其位置或 功能 发生变化时 看起来 QDockWidget 没有 调整大小 信号 如果您不希望子类化以仅获得调整大小事件控件 您可以安装事件过滤器

随机推荐

  • 线性代数 --- 最小二乘在直线拟合上的应用与Gram-Schmidt正交化(上)

    最小二乘在直线拟合上的应用 在前一篇最小二乘的文章中 线性代数 投影与最小二乘 下 多元方程组的最小二乘解与向量在多维子空间上的投影 松下J27的博客 CSDN博客多变量方程组的最小二乘 向量到多维子空间上的投影 https blog cs
  • 如何找数组中唯一重复的数?

    如何找数组中唯一重复的数 题目 方法一 不使用辅助空间的方法 思路 1 异或 同0异1 2 一组数连续异或 相当于消除重复的数 所以可以把1到1000这1000个数异或以后 和数组中的1001个元素异或 这样结果就是重复的元素 例 数组为
  • 热门面试题

    Transactional失效场景 没有将使用该注解的类交给Spring管理 也就是该对象不是bean对象 Transactional 应用在非 public 修饰的方法上 同一个类中方法之间的调用 导致 Transactional 失效
  • L - Sticky Situation

    L Sticky Situationhttps vjudge csgrandeur cn problem Kattis stickysituation 题意 给定一个 n 和 n 个数 看存不存在三个数可以构成三角形 include
  • hive中的EXPLODE和LATERAL VIEW

    行转列操作 0 函数说明 EXPLODE col 将 hive 一列中复杂的 array 或者 map 结构拆分成多行 LATERAL VIEW 用法 LATERAL VIEW udtf expression tableAlias AS c
  • 关于Rust

    Rust 文章目录 Rust 开发环境搭建 在线模式 离线模式 引入自定义第三方库 通用编程概念 Hello 注释 印屏 Display 变量 变量可变性 不可变变量与常量 变量冻结 延迟绑定 变量隐藏 数据类型 基本数据类型 类型别名 简
  • android 学习中遇到的知识点(杂)

    1 用xml 合成图片 ic launcher xml 作用 将两个图片组合成一个图片 一个背景图 一个icon
  • Oracle 实例名/服务名 请问SID和Service_Name有什么区别啊?

    可以简单的这样理解 一个公司比喻成一台服务器 数据库是这个公司中的一个部门 1 SID 一个数据库可以有多个实例 如RAC SID是用来标识这个数据库内部每个实例的名字 就好像一个部门里 每个人都有一个自己的名字 2 SERVICE NAM
  • spring boot 整合mybatis

    环境 eclipse Version 2019 06 4 12 0 jdk java version 1 8 0 144 maven Apache Maven 3 6 1 步骤 1 https spring io projects spri
  • 满月——有技巧的暴力

    题目描述 某一天你要去看满月 但是你发觉月亮只能看到一部分 现在你看到这些部分全部抽象成平面上的点 并且这些点只可能是在月亮的中心或者是月亮的边缘上 现在问你 月亮可能在什么位置上 就是哪个点可以做月亮的中心 输入 第一行一个整数N 表示有
  • 位运算符之异或

    按位运算符 异或 1 按位运算符 按位运算符对整数值的位进行操作 例如 左移运算符将位向左移 按位非运算符将所有的1变成0 所有的0变为1 C 共有6个这样的运算符 lt lt gt gt 今天我们来介绍其中一种 异或运算符 2 按位异或运
  • SpringBoot整合RabbitMQ

    该篇文章内容较多 包括有rabbitMq相关的一些简单理论介绍 provider消息推送实例 consumer消息消费实例 Direct Topic Fanout的使用 消息回调 手动确认等 但是关于rabbitMq的安装 就不介绍了 在安
  • ElasticSearch第七讲 ES查询速度为什么那么快

    介绍给大家一个开源SpringCloud项目 整合了大部分开源中间件 详情信息可以查看文档 spring cloud开源组件开发 另外自己以后博客所讲解的代码内容 都会我的Git上同步 GitHub同步 GIT地址 ES使用的数据结构是倒排
  • Git基础(常用命令)介绍

    版本控制是一种记录若干文件内容变化 以便将来查阅特定版本修订情况的系统 关于版本控制分为三种 本地版本控制系统 如rcs 集中化的版本控制系统 如CVS SVN 分布式版本控制系统 如Git Git基础要点 Git和其它版本控制系统的主要差
  • 【华为OD机试】乱序整数序列两数之和绝对值最小【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 给定一个随机的整数 可能存在正整数和负整数 数组 nums 请你在该数组中找出两个数 其和的绝对值 nums x nums y 为最小值 并返回这个两个数 按从小到大
  • 安卓开发--应用市场的界面制作(一)--viewpager+fragment实现可滑动的底部导航栏

    相关文章 前言 布局文件 MainAcivity 细节 相关文章 Android Fragment完全解析 关于碎片你所需知道的一切 这是一片很不错的博文 基本上看完就懂fragment是个什么情况了 ViewPager防止Fragment
  • 什么是智慧矿山解决方案发展方向?企业又该怎么做呢?

    什么是智慧矿山呢 智慧矿山是指采用现代高新技术和全套矿山自动化设备等等一些新兴的技术来提高矿山的生产效率和经济效益 通过对矿山生产过程进行实时动态监控 通过这些措施能够让矿山生产维持在最佳状态和最优水平 新型数字化技术能够帮助传统矿业在生产
  • STM32 PWM输出

    STM32 PWM输出 工作过程 我们假定定时器工作在向上计数PWM 模式 且当 CNT
  • 天梯赛座位分配PTA

    天梯赛座位分配PTA 天梯赛座位分配PTA TOC 前言 PTA的一道题目 一 题目内容 题目 天梯赛每年有大量参赛队员 要保证同一所学校的所有队员都不能相邻 分配座位就成为一件比较麻烦的事情 为此我们制定如下策略 假设某赛场有 N 所学校
  • QT学习_02_Lambda表达式——槽函数的正确打开方式

    1 带参数的信号 假设发送的信号带参数 信号是可以重载的 我用同一个函数名称 一个带参数 一个不带参数 在点击 切换到主窗口 按钮的时候 同时发射这两个信号 subwidget h ifndef SUBWIDGET H define SUB
Powered by Hwhale