Qt信号和信号槽(二)

2023-10-26

目录

信号槽使用拓展

示例1(一个信号可以对应多个槽函数)(在上篇文章的代码中进行修改):

 示例2(用信号连接信号):

 信号槽的连接方式

示例:

Lambda表达式

语法格式

定义和调用

信号槽使用拓展

一个信号可以连接多个槽函数, 发送一个信号有多个处理动作

        需要写多个connect()连接

        槽函数的执行顺序是随机的,和connect函数的调用顺序没有关系

        信号的接收者可以是一个对象,也可以是多个对象

一个槽函数可以连接多个信号,多个不同的信号,处理动作是相同的

        需要写多个connect()连接

信号可以连接信号

        信号接收者可以不处理接收的信号,而是继续发射新的信号,这相当于传递了数据,并没有对数据进行处理

connect(const QObject *sender, &QObject::signal, 
        const QObject *receiver, &QObject::siganl-new);

信号槽是可以断开的

disconnect(const QObject *sender, &QObject::signal, 
        const QObject *receiver, &QObject::method);
示例1(一个信号可以对应多个槽函数)(在上篇文章的代码中进行修改):

在mainwindow.h中再添加一个槽函数

 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "test.h"
#include "test01.h"
#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    //添加need按钮的槽函数
    void needSlot();

    void need1Slot();

private:
    Ui::MainWindow *ui;

    Test01* m_whatnd;
    Test* m_need;
};
#endif // MAINWINDOW_HS

到mainwindow.cpp中定义并进行连接

 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_whatnd = new Test01;
    m_need = new Test;
    connect(m_need,&Test::need,m_whatnd,&Test01::what_need);
    connect(m_need,&Test::need,this,&MainWindow::need1Slot);
    connect(ui->need,&QPushButton::clicked,this,&MainWindow::needSlot);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::needSlot()
{
    //发射自定义信号
    emit m_need->need();

}

void MainWindow::need1Slot()
{
    qDebug()<<"你什么都不需要";
}

运行程序,应用程序输出两条语句:

 示例2(用信号连接信号):

对mainwindow.cpp中的信号连接进行修改

 运行结果和原先一样:

 信号槽的连接方式

Qt5的连接方式

// 语法:
QMetaObject::Connection QObject::connect(
    	const QObject *sender, PointerToMemberFunction signal, 
        const QObject *receiver, PointerToMemberFunction method, 
		Qt::ConnectionType type = Qt::AutoConnection);

// 信号和槽函数也就是第2,4个参数传递的是地址, 编译器在编译过程中会对数据的正确性进行检测
connect(const QObject *sender, &QObject::signal, 
        const QObject *receiver, &QObject::method);

示例:

在test01.h中进行函数重载

 在mainwindow.cpp中做以下修改

 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_whatnd = new Test01;
    m_need = new Test;
    void(Test::*test1)(QString) = &Test::need;
    void(Test::*test2)(QString) = &Test::need;
    void(Test01::*mypoint)(QString) = &Test01::what_need;
    connect(m_need,test2,m_whatnd,mypoint);
    connect(m_need,test2,this,&MainWindow::need1Slot);
    //信号连接信号
    //connect(ui->need,&QPushButton::clicked,m_need,&Test::need);
    connect(ui->need,&QPushButton::clicked,this,&MainWindow::needSlot);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::needSlot()
{
    //发射自定义信号
    emit m_need->need();
    m_need->need("吃饭");

}

void MainWindow::need1Slot()
{
    qDebug()<<"你什么都不需要";
}

运行结果:

 

 

Lambda表达式

Lambda表达式是 C++ 11 最重要也是最常用的特性之一,是现代编程语言的一个特点,简洁,提高了代码的效率并且可以使程序更加灵活,Qt是完全支持c++语法的, 因此在Qt中也可以使用Lambda表达式。

语法格式

Lambda表达式就是一个匿名函数, 语法格式如下:

[capture](params) opt -> ret {body;};
    - capture: 捕获列表
    - params: 参数列表
    - opt: 函数选项
    - ret: 返回值类型
    - body: 函数体

关于Lambda表达式的细节介绍:

  1. 捕获列表: 捕获一定范围内的变量
    • [] - 不捕捉任何变量
    • [&] - 捕获外部作用域中所有变量, 并作为引用在函数体内使用 (按引用捕获)
    • [=] - 捕获外部作用域中所有变量, 并作为副本在函数体内使用 (按值捕获)
      • 拷贝的副本在匿名函数体内部是只读的
    • [=, &foo] - 按值捕获外部作用域中所有变量, 并按照引用捕获外部变量 foo
    • [bar] - 按值捕获 bar 变量, 同时不捕获其他变量
    • [&bar] - 按引用捕获 bar 变量, 同时不捕获其他变量
    • [this] - 捕获当前类中的this指针
      • 让lambda表达式拥有和当前类成员函数同样的访问权限
      • 如果已经使用了 & 或者 =, 默认添加此选项
  2. 参数列表: 和普通函数的参数列表一样
  3. opt 选项 –> 可以省略
    • mutable: 可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)
    • exception: 指定函数抛出的异常,如抛出整数类型的异常,可以使用throw();
  4. 返回值类型:
    • 标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略
  5. 函数体:
    • 函数的实现,这部分不能省略,但函数体可以为空。
定义和调用

因为Lambda表达式是一个匿名函数, 因此是没有函数声明的, 直接在程序中进行代码的定义即可, 但是如果只定义匿名函数在程序执行过程中是不会被调用的。

// 匿名函数的定义, 程序执行这个匿名函数是不会被调用的
[](){
    qDebug() << "hello, 我是一个lambda表达式...";
};

// 匿名函数的定义+调用:
int ret = [](int a) -> int
{
    return a+1;
}(100);  // 100是传递给匿名函数的参数

Lambda表达式的捕获列表中也就是 []内部添加不同的关键字, 就可以在函数体中使用外部变量了。

// 在匿名函数外部定义变量
int a=100, b=200, c=300;
// 调用匿名函数
[](){
    // 打印外部变量的值
    qDebug() << "a:" << a << ", b: " << b << ", c:" << c;  // error, 不能使用任何外部变量
}

[&](){
    qDebug() << "hello, 我是一个lambda表达式...";
    qDebug() << "使用引用的方式传递数据: ";
    qDebug() << "a+1:" << a++ << ", b+c= " << b+c;
}();

// 值拷贝的方式使用外部数据
[=](int m, int n)mutable{
    qDebug() << "hello, 我是一个lambda表达式...";
    qDebug() << "使用拷贝的方式传递数据: ";
    // 拷贝的外部数据在函数体内部是只读的, 如果不添加 mutable 关键字是不能修改这些只读数据的值的
    // 添加 mutable 允许修改的数据是拷贝到函数内部的副本, 对外部数据没有影响
    qDebug() << "a+1:" << a++ << ", b+c= " << b+c;
    qDebug() << "m+1: " << ++m << ", n: " << n;
}(1, 2);

总结:文章中主要介绍了Qt中的信号槽, 主要内容包括: 信号槽的拓展Lambda表达式。 

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

Qt信号和信号槽(二) 的相关文章

  • 如何使用QMake的子目录模板?

    我开始学习Qt 我即将离开 Visual Studio 世界 正在寻找一种使用 QMake 组织项目结构的方法 我找到了 子目录 模板 但我很难理解它 我的项目结构如下所示 project dir main cpp project pro
  • 如何使用 quazip 压缩目录/文件夹?

    我有一个目录 其中包含我想要压缩的文件和文件夹 我正在使用 qt project quazip 所以我想我写一个函数来打包目录的所有内容 包括文件结构 如何在 zip 文件中创建文件夹 我尝试使用 QuaZipNewInfo 但无法使其工作
  • QNetworkAccessManager没有完成信号

    我想直接请求和响应而不是使用connect SLOT finished SLOT 您可以使用QEventLoop以便应用程序等待并可以同时处理其他事件 include
  • 带文本的 QToolButton:覆盖最小高度以模仿常规按钮高度

    我正在显示Q工具按钮 http doc qt io qt 5 qtoolbutton html带有图标加文本的 s Qt 图标旁边的工具按钮文本 http doc qt io qt 5 qt html ToolButtonStyle enu
  • 使用 Qt Designer 调整 Qt 拆分器布局大小行为

    我在 Qt 中通过拖放制作的视图中存在尺寸问题 让我从一张图片开始来帮助我解释 这是我的表单的主窗口 发生的情况是 我们有 4 个选项卡小部件 左侧选项卡小部件有一个到 2 个中间小部件的水平分割器 2 个中间小部件有一个垂直分离器 左侧和
  • 在 Qt 中显示 QImage 的灰度并调整其大小

    我已经能够使用如下内容在 Qt 中的标签中显示图像 transformPixels 0 0 1 imheight imwidth 1 sets unsigned char imageData unsigned char fullCharAr
  • QDockWidget - 浮动时没有边框的窗口

    赢7 Qt 5 3 I use a QDockWidget与我的申请 按预期工作 现在我通过设置隐藏标题栏setTitleBarWidget new QWidget this 到默认构造的小部件 根据 Qt 文档 这是标准方法 也可以 标题
  • 如何让 Qt 识别 QMYSQL 驱动程序

    我试图从 Qt 应用程序访问 MySql 数据库 但出现以下错误 QSqlDatabase QMYSQL driver not loaded QSqlDatabase available drivers QSQLITE QSQLITE2 我
  • Qt Creator错误代码-1073741819

    好的 Qt Creator 和我尝试在 项目 gt 应用程序 gt Qt Gui 应用程序 下创建最基本的应用程序 项目创建成功 此外 当我编译它时 它似乎工作得很好 11 07 38 Running steps for project T
  • 如何使用 QCustomPlot 高效地绘制大型时间序列?

    我目前正在 Qt 中绘制数字信号QCustomPlot但似乎当样本数大于10000000时 操作变得非常慢 我有一个time向量和一个data矢量 我设置数据如下 QCustomPlot plot QCPGraph graph graph
  • 如何更改 Mac OS X 系统菜单上的 Qt 应用程序名称?

    我的 Qt 应用程序在 Mac OS X 菜单上显示为一个相当不友好的名称 名字看起来像我的时髦应用程序 我该如何将其更改为更讨人喜欢的内容 拥有一个 Info plist 并将 CFBundleName 设置为您喜欢的名称
  • 选择 Qt 写入文本文件的自定义行结尾

    在 Qt 中写入文本文件时 使用 QFile 和 QTextStream 任何 n or endl自动转换为正确的平台特定行结尾 例如 r n对于 Windows 我想让用户选择使用哪个文件结尾 有没有办法在不使用二进制文件模式的情况下设置
  • 线程:在 GUI 线程之外使用像素图是不安全的

    我正在构建一个音乐播放器 它使用 SqueezePlay 一个 SqueezeBox 控制器应用程序 检查状态 长话短说 我使用线程每 5 秒检查一次 Squeezeplay 的状态 如果歌曲标题发生变化 我让它更新标签 Qlabel 专辑
  • OpenGL资源共享策略

    我正在创建一个类似 CAD 的应用程序 基于 Qt 它将是一个多文档界面 每个文档将包含大约 5 个视口 源自 QGLWidget 因此 我需要在整个应用程序中共享平面着色器 然后在每个文档 即 5 个视口 之间共享 3D 资源 存储为 V
  • QThread::start(优先级) 与 Linux

    我正在使用一些QThread基于 KDE Neon 18 04 中的工作线程 基于 Ubuntu 18 04 内核 4 15 0 46 generic 工作线程干扰了我的桌面应用程序 因此我决定降低它们的优先级 Qt 文档QThread s
  • 使用QMediaPlayer播放资源中的mp3文件

    我尝试播放资源中声明的 mp3 文件 但它显示 Btn clicked current media qrc sound sound FarAway mp3 Error QMediaPlayer FormatError Media state
  • qtcreator - 未定义符号:sqlite3_column_table_name16

    我刚刚升级到 xubuntu 18 10 qt 不再为我工作 我已经删除并重新安装它 但没有帮助 我在终端上收到以下错误消息 显然某些 sqlite 依赖关系不正确 qtcreator qtcreator symbol lookup err
  • 如何循环 QAbstractItemView 索引?

    我想开火QAbstractItemView doubleClicked以编程方式为具有特定文本的项目插入槽 我想用QAbstractItemView如果可能的话 类而不是它的实现 此任务归结为循环项目和比较字符串 但我找不到任何方法可以给我
  • 如何以编程方式将 QMainWindow 大小调整为其最小大小

    当我有一个带有网格布局的 QMainWindow 时 当用鼠标调整它的大小时 它不会低于其中所有控件正确显示所需的最小尺寸 在我的应用程序中 我有时会以编程方式隐藏控件 但随后窗口保持相同的大小 其余控件看起来分散开来 它们之间的空间太大
  • Chrome 插件随机向我的 C++ 本机主机应用程序发送垃圾

    我正在尝试为我的大学项目编写一个简单的家长控制应用程序 但我是浏览器插件的新手 我想使用Chrome插件将用户实时查看的主机发送到Qt应用程序 Qt应用程序将分析用户行为 问题是 有时 chrome 发送正确的主机 有时它发送带有空字符串或

随机推荐

  • TCN-时间卷积网络

    目录 一 引言 二 时序卷积神经网络 2 1 因果卷积 Causal Convolution 2 2 膨胀卷积 Dilated Convolution 2 3 残差链接 Residual Connections 三 讨论和总结 1 TCN的
  • 前端笔记列表

    下载 我的博客 欢迎交流 我的CSDN博客 欢迎交流 微信小程序专栏 前端笔记专栏 微信小程序实现部分高德地图功能的DEMO下载 微信小程序实现MUI的部分效果的DEMO下载 微信小程序实现MUI的GIT项目地址 微信小程序实例列表 前端笔
  • 【docker系列】使用非root用户安装及启动docker(rootless模式运行)

    通过我之前的文章已经可以验证 在root用户下安装启动的容器存在安全问题 究其原因是因为 容器内的root用户就是宿主机的root用户 容器内uid 1000的用户就是宿主机uid 1000的用户 docker的守护进程是root权限的 既
  • 华为2014校园招聘笔试,围棋吃子判断

    题目大意 一个围棋盘的位置总共有三种状态 分别为空 白棋 黑棋 分别用0 1 2来表示 每一个位置都有上下左右四个邻居 当其邻居中有一个空格 则说明这个位置的棋子有气 当然 气是可以传递的 即只要一颗棋子它周围有气 则所有与该棋子相连的相同
  • 反激变换器DCM模式增益推导

    针对反激变换器的DCM 电感电流断续模式 的增益进行推导 主要原理为电感的伏秒平衡和电容的安秒平衡原理 反激变换器的原理图如下 根据电容的安秒平衡原理可知 输出电容C在一个周期内的平均电流为0 故输出侧电流i2的平均值等于负载电流平均值 式
  • 如何制定性能测试计划

    如何制定一份性能测试计划 考虑以下几个方面 1 明确测试目标和范围 确定要测试的系统 应用程序或网站 并明确测试的目标和范围 例如测试响应时间 吞吐量 并发用户数等 2 确定测试环境 选择适当的测试环境 包括硬件 软件 网络等 以确保测试结
  • Intrinsics头文件与SIMD指令集、Visual Studio版本对应表

    Intrinsics头文件与SIMD指令集 Visual Studio版本对应表 File Intrinsics头文件 描述 指令集描述 VS Visual Studio版本号 VisualStudio Visual Studio版本名 F
  • 微信小程序上传图片到阿里云OSS,读取上传后oss后的图片

    一 config js var fileHost xxxx aliyuncs com 你的阿里云oss地址 var config aliyun OSS config uploadImageUrl fileHost 默认存在根目录 可根据需求
  • Static Timing Analysis for Nanometer Designs A Practical Approach

    分享电子书籍 静态时序分析圣经 Static Timing Analysis for Nanometer Designs A Practical Approach 1 setup time Setup time 建立时间 是数据信号 D 在
  • 小程序 - 日期选择器

    效果图 实现步骤 1 创建组件 wxml
  • Unity3D控制Animator播放

    有一个需求 要求第一次打开一个界面触发一个动画播放 关闭界面动画播放关闭 再次打开界面继续上次到播放而不是重新开始播放 如果动画播放结束关闭打开界面入口 即无法在此进入该界面 有两种实现方法 方法1 第一次打开界面开始播放特效动画 调用an
  • AI—漂亮的花简单制作(含详细教程)

    暑假在家刷短视频 不 不 不 球球 别别别 平面制作搞起来 跟数媒小可爱学炒鸡有意思的AI吧 今天带来的是一朵漂亮的花 gt 效果图入下 步骤一 用 星形 工具 gt 角点数 为25 如图 gt 确定 步骤二 按住ALT键 复制一个星形 缩
  • 再也不用担心网吧开黑队友听不清了!降噪解决方案了解一下?

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由腾讯游戏云发表于云 社区专栏 经常逛游戏论坛的朋友会深有感触 很多玩家经常会在论坛里吐槽在网吧开黑的体验很差 噪音太多 在游戏语音开黑的过程中 如果其中一个队友身处网吧 则其他
  • chronyc sources -V

    Chrony 是一个时钟同步工具 而 chronyc sources V 是它的命令行参数 用于显示当前时钟源的详细信息 使用这个参数后 会输出当前时钟源的信息 包括 源类型 IP 地址 可用性 偏差和误差等 通过这些信息 可以了解时钟源的
  • Linux 编译运行查找头文件和库的顺序

    linux中在使用gcc进行编译时 可能会出现找不到相应库或头文件的情况 往往让人十分头疼 因此 此文描述了库和头文件的查找顺序和一些注意事项 希望能帮助大家在出错时能够快速定位和解决 头文件 gcc在编译时按照如下顺序寻找所需要的头文件
  • set,env和export的区别

    http blog csdn net longxibendi article details 6125075 http blog chinaunix net uid 128922 id 289956 html set 显示 设置 shell
  • JSP编程手记------jsp页url中传中文参数乱码问题续

    一个偶然的机会 发现了一个解决jsp页url中传中文参数乱码的方法 比我前面说的用隐形的form表单来的更加漂亮和容易 具体方法如下 程序清单 response sendRedirect gh 0001 xm java net URLEnc
  • Qt手动设置Kits套件

    Qt编译器版本手动设置方式 文章目录 Qt编译器版本手动设置方式 前言 一 安装MSVC2019 32bit 二 手动设置kits套件 总结 前言 在给Qt Creator添加自定义控件时 遇到的版本问题让人头疼 我用的Qt5 12 10
  • 那一年读过的技术经典书

    转载请注明 http blog csdn net xinzhangyanxiang article details 10199757 大学刚毕业 总结起来读过的书并不算多 而且主要集中在大四的时期读的 在此把经典统一总结一遍 先总结机器学习
  • Qt信号和信号槽(二)

    目录 信号槽使用拓展 示例1 一个信号可以对应多个槽函数 在上篇文章的代码中进行修改 示例2 用信号连接信号 信号槽的连接方式 示例 Lambda表达式 语法格式 定义和调用 信号槽使用拓展 一个信号可以连接多个槽函数 发送一个信号有多个处