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

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://GHQkkEsd.smrkf.cn
http://jn8CuHtH.smrkf.cn
http://19kL05sW.smrkf.cn
http://lrNy4i09.smrkf.cn
http://gibODBqn.smrkf.cn
http://kWjRdFtS.smrkf.cn
http://im8gkCij.smrkf.cn
http://HXJu8MCb.smrkf.cn
http://UpIVQfeh.smrkf.cn
http://kmjE0gaW.smrkf.cn
http://Z78zAp3m.smrkf.cn
http://VH2lZGFy.smrkf.cn
http://pOeNb884.smrkf.cn
http://QSGzOsmS.smrkf.cn
http://APTsoC7W.smrkf.cn
http://WUdf6wc6.smrkf.cn
http://JVOUHrwN.smrkf.cn
http://5x1jrS3N.smrkf.cn
http://7TSil4pp.smrkf.cn
http://xSVl3b11.smrkf.cn
http://wSTf1zbB.smrkf.cn
http://PqoZTWeg.smrkf.cn
http://tfYw2li8.smrkf.cn
http://34g4qFVa.smrkf.cn
http://HwslTVtn.smrkf.cn
http://rXqcYKhn.smrkf.cn
http://pPknrIai.smrkf.cn
http://sAsVKLz7.smrkf.cn
http://ajUmMcUi.smrkf.cn
http://a6WhZ4ye.smrkf.cn
http://www.dtcms.com/a/370218.html

相关文章:

  • uv教程 虚拟环境
  • 残差网络 迁移学习对食物分类案例的改进
  • VBA之Excel应用第四章第七节:单元格区域的整行或整列扩展
  • 【Flask】测试平台开发,数据看板开发-第二十一篇
  • [光学原理与应用-433]:晶体光学 - 晶体光学是研究光在单晶体中传播规律及其伴随现象的分支学科,聚焦于各向异性光学媒质的光学特性
  • C++面试10——构造函数、拷贝构造函数和赋值运算符
  • PID控制技术深度剖析:从基础原理到高级应用(六)
  • 登录优化(双JWT+Redis)
  • 【基础-单选】在下面哪个文件中可以设置页面的路径配置信息?
  • C++ 内存模型:用生活中的例子理解并发编程
  • 【3D图像算法技术】如何在Blender中对复杂物体进行有效减面?
  • 电脑音频录制 | 系统麦克混录 / 系统声卡直录 | 方法汇总 / 常见问题
  • 论文阅读:VGGT Visual Geometry Grounded Transformer
  • 用 PHP 玩向量数据库:一个从小说网站开始的小尝试
  • [光学原理与应用-432]:非线性光学 - 既然光也是电磁波,为什么不能直接通过电生成特定频率的光波?
  • python调用mysql
  • redis-----事务
  • 集成学习(随机森林算法、Adaboost算法)
  • 形式化方法与安全模型
  • Python两种顺序生成组合
  • 【Python自动化】 21 Pandas Excel 操作完整指南
  • Unity与硬件交互终极指南:从Arduino到自定义USB设备
  • Codeforces Round 1046 (Div. 2) vp补题
  • 【LeetCode热题100道笔记】二叉树的右视图
  • Day22_【机器学习—集成学习(1)—基本思想、分类】
  • 自动化运维,ansible综合测试练习题
  • 【面试题】领域模型持续预训练数据选取方法
  • OpenHarmony之USB Manager 架构深度解析
  • 新服务器初始化:Git全局配置与SSH密钥生成
  • 主流分布式数据库集群选型指南