Qt6.2教程——3.Qt信号和槽

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

Qt信号和槽

信号和槽是Qt中一个强大的特性,用于处理对象之间的通信。它们是一种事件处理机制,允许一个对象在某个事件发生时通知另一个对象。

一,信号(Signals)

  • 定义: 信号是一个QObject的成员函数,当某个特定事件发生时,它被自动调用。它可以与一个或多个槽关联。

  • 声明: 在Qt类的声明中,信号作为一个特殊类型的成员函数,需要放在signals访问规范符下。

  • 发射: 当某个条件满足或事件发生时,可以使用emit关键字发射一个信号。

  • 示例:

class MyButton : public QPushButton {
    Q_OBJECT

public:
    MyButton(QWidget *parent = nullptr);

signals:
    void clicked(); // 信号声明
};

二,槽(Slots)

  • 定义: 槽是普通的C++成员函数,可以在类中以任何访问修饰符(public, protected, private)声明。

  • 目的: 主要用于响应信号,执行一些任务。

  • 声明: 在Qt类的声明中,槽需要放在public slots, protected slots 或 private slots下。

  • 示例:

class MyWidget : public QWidget {
    Q_OBJECT

public:
    MyWidget(QWidget *parent = nullptr);

public slots:
    void onButtonClicked(); // 槽声明
};

三,连接信号和槽

  • 目的: 将一个对象的信号与另一个对象的槽连接起来,以便当信号被发射时,槽被调用。

  • 使用: connect()函数用于连接信号和槽。

  • 示例:

MyButton *button = new MyButton();
MyWidget *widget = new MyWidget();

connect(button, &MyButton::clicked, widget, &MyWidget::onButtonClicked);

四,断开连接

  • 目的: 在某些情况下,你可能希望断开信号和槽之间的连接。

  • 使用: disconnect()函数用于断开信号和槽。

  • 示例:

disconnect(button, &MyButton::clicked, widget, &MyWidget::onButtonClicked);

五,lambda函数和信号

  • 你还可以使用C++11的lambda函数作为槽。

  • 示例:

connect(button, &QPushButton::clicked, [=]() {
    qDebug() << "Button clicked";
});

六,connect()函数的5个参数版本

除了前面提到的4个参数版本的connect()函数之外,还有一个5个参数的版本,这个版本允许你指定连接类型。

这是connect()函数的5个参数版本的形式:

connect(sender, signal, receiver, slot, connectionType);
  • sender: 发送信号的对象。

  • signal: 发送对象的信号。

  • receiver: 接收信号并处理槽的对象。

  • slot: 接收对象的槽,用于处理信号。

  • connectionType: 这是一个标志,指定连接的类型。可能的值有:

    • Qt::AutoConnection: (默认) 如果接收者和发送者在同一线程,它就是一个直接连接,否则, 它是一个队列连接。
    • Qt::DirectConnection: 槽函数直接在发送信号的函数中调用,就像是直接调用一样。
    • Qt::QueuedConnection: 槽函数在控制返回到接收者所在的线程的事件循环时调用。
    • Qt::BlockingQueuedConnection: 类似于Qt::QueuedConnection,但是发送者线程会阻塞,直到槽函数返回。
    • Qt::UniqueConnection: 这个标志用于确保一个特定的信号-槽对只连接一次。
  • 示例:

connect(button, &QPushButton::clicked, widget, &MyWidget::onButtonClicked, Qt::DirectConnection);

在此示例中,当按钮被点击时,onButtonClicked槽将直接在发送信号的函数中调用。

请注意,谨慎使用Qt::DirectConnection和Qt::BlockingQueuedConnection,因为它们可能会导致线程安全问题或阻塞UI。

七,信号和槽的原理

Qt的信号和槽机制与传统的C++回调函数或者事件处理机制不同。下面是信号和槽背后的原理。

元对象系统 (Meta-Object System)

  • Qt的信号和槽机制是基于其元对象系统。这个系统提供了信号和槽的运行时类型信息。

  • Qt的类需要使用Q_OBJECT宏来启用元对象特性,这是信号和槽工作的必要条件。

moc (Meta-Object Compiler)

  • Qt带有一个名为moc的元对象编译器。它是Qt工具链的一部分,用于处理信号和槽以及其他Qt特性。

  • moc解析包含Q_OBJECT宏的类,并为这些类生成额外的C++源代码文件。这些生成的文件包含了必要的元信息,使信号和槽能够在运行时找到对应的成员函数。

连接过程

  • 当你使用connect()函数连接一个信号到一个槽时,Qt在内部创建一个包含有关发送者,信号,接收者和槽的信息的连接对象。

  • 当信号被发射时,Qt使用这个信息查找和调用与信号关联的所有槽。

线程模型

  • Qt的信号和槽机制也支持多线程。槽函数可以在发送信号的线程(Qt::DirectConnection)或者接收者对象的线程(Qt::QueuedConnection)中执行。

  • 这为开发者提供了一种灵活的方式来控制多线程应用程序的行为。

总结

以上是关于Qt的信号和槽的基本介绍,它是一个非常强大和灵活的方式来处理事件和使你的应用程序具有交互性。文章来源地址https://www.toymoban.com/news/detail-498577.html

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

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

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

相关文章

  • QT之信号和槽

    一、什么是信号和槽? 我们经常看到的功能,点击一个按钮实现窗口关闭。 这一过程发生了什么?是怎么实现的 按钮相当于一个信号,点击相当于发送一个信号,窗口是个接收者,关闭窗口是个槽函数 信号:各种事件 槽:响应信号的动作 当一个按钮(信号)被触发(发送

    2024年02月07日
    浏览(24)
  • 【Qt】信号和槽

     需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。   目录 一、Qt中的信号和槽 1、信号 2、槽 3、Q_OBJECT 二、Qt中的connect函数 三、自定义信号、自定义槽 1、自定义槽函数 1.1使

    2024年01月21日
    浏览(30)
  • 07.QT信号和槽-2

            在Qt中,允许⾃定义信号的发送⽅以及接收⽅,即可以⾃定义信号函数和槽函数。但是对于⾃定义的信号函数和槽函数有⼀定的书写规范。 1.1 自定义信号 (1)⾃定义信号函数必须写到\\\"signals\\\"下; (2)返回值为void,只需要声明,不需要实现; (3)可以有参数,

    2024年04月14日
    浏览(25)
  • Qt 信号和槽机制

    一. 简介         在Qt中使用信号和槽机制来完成对象之间的协同操作。简单来说,信号和槽都是函数,比如按下窗口上的一个按钮后想要弹出一个对话框,那么就可以将这个按钮的单击信号和我们定义的槽关联起来,在这个槽中可以创建一个对话框,并且显示它。这样,

    2024年01月18日
    浏览(30)
  • 【Qt】信号和槽机制

    目录 一、认识信号和槽 二、connect函数 三、自定义槽函数 四、自定义信号 五、带参数的信号和槽 六、信号和槽断开连接 七、信号和槽存在的意义 八、Lambda表达式定义槽函数 概述 在Qt中,用户和控件的每次交互过程称为一个事件。如\\\"用户点击按钮\\\"是一个事件,\\\"用户关闭窗

    2024年02月22日
    浏览(33)
  • [Qt的学习日常]--信号和槽

    前言 作者 :小蜗牛向前冲 名言 :我可以接受失败,但我不能接受放弃   如果觉的博主的文章还不错的话,还请 点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习:什么是信号和槽,自定义槽函数和信号函数,信号和槽的传参,断开,

    2024年04月28日
    浏览(20)
  • 02 qt基本控件及信号和槽

    功能:显示一个字符串内容 主要接口函数 构造函数: 赋值运算符重载: 功能函数: 1)基本数据类型(int,float,double,char*)转换成字符串 number(long , int ) : QString number(int , int ) : QString number(uint , int ) : QString number(ulong , int ) : QString number(qlonglong , int ) : QString number(qulonglong , int

    2024年02月12日
    浏览(30)
  • Qt快速学习(一)--对象,信号和槽

    目录 1.Qt概述 1.1 什么是Qt 2.2 手动创建 2.3 pro文件 2.4 一个最简单的Qt应用程序        3 第一个Qt小程序 3.1 按钮的创建 3.2 对象模型(对象树)       3.3 Qt窗口坐标体系 4 信号和槽机制         4.1 系统自带的信号和槽 4.2 自定义信号和槽     4.3信号槽的拓展     

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

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

    2024年02月15日
    浏览(34)
  • qt信号和槽避免多次连接

    qt同一个信号和槽多次连接,则槽函数 会触发多次 (默认),可能不是我们想要的结果。 有3种方法可以解决这个问题: 因为初始化函数在在整个程序中只运行一次,所以这里面连接信号和槽,就能避免重复连接问题了。 Qt::UniqueConnection 的作用是:如果该信号以前没连接过

    2024年02月10日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包