【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

相关文章

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

使用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使用场景场景一:函数返回可能不存在的值场景