当前位置: 首页 > ds >正文

Qt编程之信号与槽

一、信号与槽是什么?

        1.信号和槽是一种通信机制,用于Qt对象之间的通信。是Qt的核心特性。

        说明:信号和槽这种通信功能,是由QObject这个类提供的,所以,我们把QObject类及它的派生类对象,称为Qt对象。

信号:是一个函数,当一个Qt对象的内部状态发生改变时,就可以发出一个信号。

槽:是一个函数,当其它Qt对象收到这个信号后,就可以执行。

        2.信号和槽的连接:Qobject提供了一个函数connect,用于连接两个Qt对象的信号和槽。

        3.对于Qt通信需要了解如下信息:

        (1)哪个对象发出信号

        (2)发出什么信号

        (3)哪个对象接收信号

        (4)收到信号后做什么

        所以,connect函数的常规参数如下:

        connect(发出信号的对象的地址,SIGNAL(信号名称),接收信号的对象的地址,SLOT(槽函数名()));

        所有的Qt对象,都有预定义信号和槽,如果预定义的信号与槽功能不能满足需求可以自定义信号和槽。

        例如:按钮最常用的信号叫clicked();按钮比较常用的槽函数有show()/hide()/setText()……

                界面常用的槽函数,有show()/hide()/close()……

        如果需要点击某个按钮时,关闭某个界面,我们只需要把按钮的点击信号与界面的关闭函数连接起来就可以了。例:connect(btn_close,SIGNAL(clicked()),this,SLOT(close()));把关闭按钮和当前界面连接起来后,只要关闭按钮被点击,就会自动发出clicked信号。界面收到信号后,立即自动调用close槽函数。

例:做一个关闭按钮,一点击,则页面关闭

#include "mydialog.h"
#include "ui_mydialog.h"MyDialog::MyDialog(QWidget *parent) :QDialog(parent),ui(new Ui::MyDialog)
{ui->setupUi(this);// 连接关闭按钮与当前界面的信号和槽,当按钮的信号发出时clicked,立即自动调用界面的槽函数closeconnect(ui->btn_close,SIGNAL(clicked()),this,SLOT(close()));
}MyDialog::~MyDialog()
{delete ui;
}

        其ui图像如下:

          右上角的X代表关闭界面的按钮,一旦点击按钮,则关闭界面。

二、自定义槽函数

        1.在头文件中声明

public/private/protected slots:返回类型 槽函数名(参数列表);

        2.在源文件中定义:返回类型 类名::槽函数名(参数列表) {函数体}

        3.使用:

        (1)像普通的函数一样直接调用

        (2)写在connect函数中与信号相连接,当信号发出来时,自动调用。

例如:利用一个按钮显示或者隐藏日期时间,一开始隐藏,按下按钮之后,显示,再按下按钮之后,隐藏……

按下按钮之后:

修改mainwindow.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();
public slots://槽函数声明void onShowOrHidewidget();private:Ui::MainWindow *ui;bool visible;
};#endif // MAINWINDOW_H

修改mainwindow.cpp文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);//初始化可见标志,FALSE表示不可见visible = false;//把界面上的日期界面隐藏ui->widget_time->setVisible(visible);//连接日期按钮与当前界面类的信号与槽connect(ui->btn_datetime,SIGNAL(clicked(bool)),this,SLOT(onShowOrHidewidget()));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::onShowOrHidewidget()
{////ui->widget_time->hide();/*if(!this->visible){this->visible=true;}else{this->visible=false;}*///每次调用槽函数,都修改可见标志的值,如果是真,则修改为假;如果为假,则修改为真。this->visible=!visible;//或者可以直接取反://设置日期界面的可见性ui->widget_time->setVisible(visible);
}

其ui界面为:

说明:关于connect中的this

例:

connect(ui->btn_datetime,SIGNAL(clicked(bool)),this,SLOT(onShowOrHidewidget()));

ui->btn_datetime,SIGNAL(clicked(bool))即调用界面上按钮(btn_datetime)的成员函数(clicked)

this,SLOT(onShowOrHidewidget())可理解为调用this指向的那个对象的成员函数(onShowOrHideWidget)

connect函数一般是写在构造函数中,构造函数中的this当然就是正在创建的那个对象的地址。比如我们这个例子中,我们用MainWindow类在main函数中创建了一个对象w,即界面对象。简单说,要发信号,得有那个信号,要调用一个槽函数,得有那个槽函数。

三、信号函数

        1.默认为公有函数,在声明信号函数时,不需要加public/private/protected

        2.自定义信号函数只需要声明,不需要用户添加定义

        3.用emit来发送信号

        4.信号函数可以传递参数,在connect中连接信号和槽时,如果有参数,只需要写参数类型即可!信号和槽函数的参数要匹配,但是槽函数的参数可以比信号函数的参数少,但不能多。

例:emit 信号函数名(实参列表);

        5.信号函数也可以重载、设置默认值。

        6.一个信号可以和一个槽相连,一个信号可以和多个槽相连。多个信号可以和一个槽相连。一个信号可以和一个信号相连。

四、自定义信号

        signals:

                void 信号函数(参数);

http://www.xdnf.cn/news/20531.html

相关文章:

  • 吴恩达机器学习(八)
  • make时设置链接器选项的2种方法
  • 【操作系统-Day 25】死锁 (Deadlock):揭秘多线程编程的“终极杀手”
  • Zoom AI 技术架构研究:联合式方法与多模态集成
  • 【LeetCode热题100道笔记】翻转二叉树
  • python炒股
  • C++ 20 新增特性以及代码示例
  • 同态加密库(Google FHE)
  • 神经网络的初始化:权重与偏置的数学策略
  • C# WinForm分页控件实现与使用详解
  • B.50.10.09-RPC核心原理与电商应用
  • MATLAB R2025a安装配置及使用教程(超详细保姆级教程)
  • 什么是云手机?
  • Vue3 - Echarts自定义主题引入(Error:ECharts is not Loaded,Error:default ,Error:module)
  • 攻击服务器的方式有哪些,对应的应对策略有哪些?
  • 联邦学习论文分享:Towards Building the Federated GPT:Federated Instruction Tuning
  • Leetcode hot100 最长连续序列
  • rh134第五章复习总结
  • SDRAM详细分析-08 数据手册解读
  • AI + 办公工具 = 应用案例
  • (论文速读)视觉语言模型评价中具有挑战性的选择题的自动生成
  • 大模型推理时的加速思路?
  • RabbitMq 初步认识
  • 自动化运维之ansible
  • LwIP入门实战 — 3 LwIP的网络接口管理
  • HTB devvortex
  • 【混元AIGC+腾讯云智能体+首创Coze核心流思维导图MCP】:打造一个文思通-智能写作助手Agent
  • 深入浅出 JVM 类加载器:分类、双亲委派与打破机制
  • 使用函数调用对整形数组进行排序
  • 贪心算法在医疗影像分割中的应用详解