【QT】QT从零入门教程(三):信号与槽

2024-08-30 19:32
文章标签 qt 入门教程 信号

本文主要是介绍【QT】QT从零入门教程(三):信号与槽,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

信号与槽

  信号和槽是QT中最基本的概念,也是QT中的核心机制。信号和槽是QT自行定义的一种通信机制,独立于标准的C/C++语言,因此要正确的处理信号和槽,必须借助moc(Meta Object Compiler)这一QT工具,该工具是个C++预处理程式,它为高层次的事件处理自动生成所需要的附加代码。

  信号与槽可以实现多信号与单个槽的连接,也可以实现单信号与多个槽的连接,甚至能实现信号间的连接,这时第一个信号发射后,第二个信号也将被即时发射。如果单信号连接多个槽,当这个信号被发射时,与之相关的槽被激活的顺序将是随机的。

  所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽。当对象改动其状态时,信号就由该对象发射(emit)出去,而槽则用于接收信号。

  signals前面不可加public、private和protected进行修饰,它必须是void类型而且只声明不定义。slots前面可以加修饰,它作为普通的C++成员函数,能被正常调用。slots区域中的函数能有参数,但其参数不能有缺省值。 宏定义不能用在signal和slot的参数中。


  1、当信号与槽函数的参数数量相同时,它们参数类型要完全一致。

// 头文件
#include <QtWidgets/QMainWindow>
#include "ui_ImageProcessing.h"class ImageProcessing : public QMainWindow
{Q_OBJECTpublic:ImageProcessing(QWidget *parent = Q_NULLPTR);private:Ui::ImageProcessingClass ui;signals:void iSignal(int b);     // 信号private slots:void iSlot(int b);       // 槽函数
};
// cpp
#include <QMainWindow>
#include <QtGui>
#include <QtWidgets>
#include "MainWindow.h"ImageProcessing::ImageProcessing(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);connect(this, SIGNAL(iSignal(int)), this, SLOT(iSlot(int)));  // 连接信号和槽函数emit iSignal(5);        // 发射信号
}void ImageProcessing::iSlot(int b)     // 槽函数定义
{QString qString;qDebug() << qString.number(b);
}


  2、当信号的参数与槽函数的参数数量不同时,只能是信号的参数数量多于槽函数的参数数量,且前面相同数量的参数类型应一致,信号中多余的参数会被忽略。

// 头文件
#include <QtWidgets/QMainWindow>
#include "ui_ImageProcessing.h"class ImageProcessing : public QMainWindow
{Q_OBJECTpublic:ImageProcessing(QWidget *parent = Q_NULLPTR);private:Ui::ImageProcessingClass ui;signals:void iSignal(int a,float b);   // 信号private slots:void iSlot(int b);             // 槽函数
};
// cpp
#include <QMainWindow>
#include <QtGui>
#include <QtWidgets>
#include "MainWindow.h"ImageProcessing::ImageProcessing(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);connect(this, SIGNAL(iSignal(int,float)), this, SLOT(iSlot(int)));  // 连接信号和槽函数emit iSignal(1000, 0.3);    // 发射信号
} void ImageProcessing::iSlot(int b)    // 槽函数定义
{QString qString;qDebug() << qString.number(b);
}


  3、在不进行参数传递时,信号槽绑定时也是要求信号的参数数量大于等于槽函数的参数数量。这种情况一般是一个带参数的信号去绑定一个无参数的槽函数。

// 头文件
#include <QtWidgets/QMainWindow>
#include "ui_ImageProcessing.h"class ImageProcessing : public QMainWindow
{Q_OBJECTpublic:ImageProcessing(QWidget *parent = Q_NULLPTR);private:Ui::ImageProcessingClass ui;signals:void iSignal(int a,float b);private slots:void iSlot();
};
// cpp
#include <QMainWindow>
#include <QtGui>
#include <QtWidgets>
#include "MainWindow.h"ImageProcessing::ImageProcessing(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);connect(this, SIGNAL(iSignal(int,float)), this, SLOT(iSlot()));emit iSignal(1000, 0.3);
}void ImageProcessing::iSlot()
{QString qString = " Qt test (signals & slots) ";qDebug() << qString;
}


断开连接

  当信号与槽没有必要继续保持关联时,我们可以使用 disconnect 函数来断开连接。其定义如下,用于断开发射者中的信号与接收者中的槽函数之间的关联。

bool QObject::disconnect(const QObject * sender, const char * signal, const Object * receiver, const char * member)

  有三种情况必须使用 disconnect() 函数:

  1、断开与某个对象相关联的任何对象。

  在某个对象中可能定义了一个或者多个信号时,这些信号与另外若干个对象中的槽相关联,如果我们要切断这些关联,就可以利用这个方法,简洁有效。

disconnect(myObject, 0, 0, 0) // myObject->disconnect()

  2、断开与某个特定信号的任何关联。

disconnect(myObject, SIGNAL(mySignal()), 0, 0) // myObject->disconnect(SIGNAL(mySignal()))

  3、断开两个对象之间的关联。

disconnect(myObject, 0, myReceiver, 0) // myObject->disconnect(myReceiver)

  在 disconnect 函数中 0 可以用作一个通配符,分别表示任何信号、任何接收对象、接收对象中的任何槽函数。但是发射者 sender 不能为 0,其它三个参数的值可以等于 0。

这篇关于【QT】QT从零入门教程(三):信号与槽的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121733

相关文章

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

无线路由器哪个品牌好用信号强? 口碑最好的三个路由器大比拼

《无线路由器哪个品牌好用信号强?口碑最好的三个路由器大比拼》不同品牌在信号覆盖、稳定性和易用性等方面各有特色,如何在众多选择中找到最适合自己的那款无线路由器呢?今天推荐三款路由器让你的网速起飞... 今天我们来聊聊那些让网速飞起来的路由器。在这个信息爆炸的时代,一个好路由器简直就是家庭网编程络的心脏。无论你

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建