Qt信号和信号槽(二)

这篇具有很好参考价值的文章主要介绍了Qt信号和信号槽(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

信号槽使用拓展

示例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中再添加一个槽函数

Qt信号和信号槽(二)

 

#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中定义并进行连接

Qt信号和信号槽(二)

 Qt信号和信号槽(二)

#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()<<"你什么都不需要";
}

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

Qt信号和信号槽(二)

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

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

Qt信号和信号槽(二)

 运行结果和原先一样:

Qt信号和信号槽(二)

 信号槽的连接方式

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中进行函数重载

Qt信号和信号槽(二)

 在mainwindow.cpp中做以下修改

Qt信号和信号槽(二)

 

#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()<<"你什么都不需要";
}

运行结果:

 Qt信号和信号槽(二)

 

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表达式。 文章来源地址https://www.toymoban.com/news/detail-511780.html

到了这里,关于Qt信号和信号槽(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt进行UDP通讯,创建一个收线程这样可以进行接收数据

    在.pro中增加一句话 绘制界面 .h文件内容: 构造函数内容 对于绑定按钮的定义函数: 接收信号的槽函数(UDP接收到数据显示) quitThreaSlot函数: 退出按钮定义: 使用的receivethread.h就是将run函数重写(循环发送定义的信号延迟即可),在定义一个信号即可。 以上即功能的所有

    2024年02月20日
    浏览(44)
  • 【Verilog实现FPGA上的信号延迟】—— 用Verilog代码实现将信号延迟N拍,这是FPGA中非常重要的一个操作,可以使数据在不同模块之间精确同步。

    【Verilog实现FPGA上的信号延迟】—— 用Verilog代码实现将信号延迟N拍,这是FPGA中非常重要的一个操作,可以使数据在不同模块之间精确同步。 模块是FPGA中最基本的构建模块。通常一个模块代表一个电路,包括输入、输出和处理逻辑。模块中包含的处理逻辑被称为时序逻辑。

    2024年02月04日
    浏览(75)
  • PyQt5利用Qt Designer制作一个可以拖动获取文件信息的页面

    前言 本篇在讲什么 用pyqt5制作一个简单的程序,拖动文件或脚本可以读取文件信息 本篇适合什么 适合 初学PyQt5 的小白 本篇需要什么 对 Python 语法有简单认知 对 Qt 有简单认知 依赖 Pycharm 编辑器 本篇的特色 具有全流程的 图文教学 重实践,轻理论,快速上手 提供全流程的

    2024年01月15日
    浏览(67)
  • ChatGPT 使用 拓展资料:使用 HuggingFace+Gradio 部署快速搭建一个ChatGPT的聊天界面

    ChatGPT 使用 拓展资料:使用 HuggingFace+Gradio 部署快速搭建一个ChatGPT的聊天界面 https://huggingface.co/spaces/duanzhihua/AI-ChatGPT 注册一个 HuggingFace 的账号,点击左上角的头像,然后点击 “+New Space” 创建一个新的项目空间 给 Space 取一个名字,然后在 Select the Space SDK 里面,选择第二个

    2024年02月04日
    浏览(46)
  • dockerfile不可以使用../作为路径在上级目录查找文件

    在 Dockerfile 中,不能直接使用 …/ 跳转到上级目录。Dockerfile 中的路径是相对于构建上下文路径的,而构建上下文指定了在构建镜像时可访问的文件和目录的范围。 如果你需要在 Dockerfile 中引用上级目录中的文件或目录,可以将上级目录作为构建上下文,并使用相对于构建上

    2024年01月25日
    浏览(39)
  • 关于一个QT程序的简单破解思路(不需要分析信号和槽的方法,通用所有程序的破解思路)

    几年前,公司买了台国产贴片机,里面的主程序是QT编写,运行在WINDOW XP系统上。主程序打开的界面,如图: 我来简单介绍下程序界面,各位读者不需要搞明白功能,只要知道大体的流程即可。 一、左边的列表: 贴片生产文件,里面包括了贴片时元器件的坐标、飞达安装的元器件类型、

    2024年01月24日
    浏览(42)
  • 1.1.4 Qt信号槽之再谈Qt4与Qt5中信号槽使用的差异

    Differences between String-Based and Functor-Based Connections 通过上面的示例和分析,我们已经明显感受到Qt4和Qt5中connect的不同之处,但是Qt文档中有一篇文章专门叙述了Qt4和Qt5中connect的差异,这里根据此篇文章带着大家再深入了解拓展一下。 从Qt5开始,Qt提供了两种不同方法的信号槽连

    2024年02月11日
    浏览(44)
  • 20221210 QT----信号和槽的使用

    什么是信号(signal) 以QPushButton为例: (1)按下按钮时,会触发一个mousePressEvent事件,此时会发出一个pressed信号; (2)松开按钮时,会触发一个mouseReleaseEvent事件,此时会发出released和clicked信号。 事件的种类有很多,不同的事件都对应着不同的信号,当事件发生时,对应

    2024年02月15日
    浏览(49)
  • C++ Qt开发:如何使用信号与槽

    在Qt中,信号与槽(Signal and Slot)是一种用于对象之间通信的机制。是Qt框架引以为傲的一项机制,它带来了许多优势,使得Qt成为一个强大且灵活的开发框架之一。信号与槽的关联通过 QObject::connect 函数完成。这样的机制使得对象能够以一种灵活而松散耦合的方式进行通信,

    2024年02月05日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包