003 Qt_信号和槽-上

简介: 本文介绍了Qt中的信号与槽机制,包括信号和槽的概念、本质及连接方法,并演示了如何自定义槽函数。信号是事件的体现,槽是对信号的响应函数。通过信号与槽,可以将独立的控件关联起来,实现复杂的交互逻辑。文中还详细展示了如何在Qt项目中定义和使用槽函数,通过实例代码和图形化界面操作,帮助读者更好地理解和应用这一机制。

@[TOC]

前言

本文将会向你介绍信号与槽的概念,以及如何自定义槽函数

信号与槽的概念

1、==在 Qt 中,用户和控件的每次交互过程称为⼀个事件。==
比如 "用户点击按钮" 是⼀个事件,"用户关闭窗⼝" 也是⼀个事件。每个事件都会发出⼀个信号,例如用户点击按钮会发出 "按钮被点击" 的信号,用户关闭窗⼝会发出 "窗⼝被关闭" 的信号。

2、==Qt 中的所有控件都具有接收信号的能⼒,⼀个控件还可以接收多个不同的信号。==
对于接收到的每个信号,控件都会做出相应的响应动作。例如,按钮所在的窗⼝接收到 "按钮被点击" 的信号后,会做出 "关闭自己" 的响应动作。在 Qt 中,对信号做出的响应动作就称之为槽。

3、==信号和槽是 Qt 特有的消息传输机制,它能将相互独立的控件关联起来。==
比如,"按钮" 和 "窗⼝"本⾝是两个独立的控件,点击 "按钮" 并不会对 "窗⼝" 造成任何影响。通过信号和槽机制,可以将 "按钮" 和 "窗⼝" 关联起来,实现 "点击按钮会使窗⼝关闭" 的效果。

信号的本质

信号是由于⽤⼾对窗⼝或控件进⾏了某些操作,导致窗⼝或控件产⽣了某个特定事件,这时 Qt 对应的窗⼝类会发出某个信号,以此对⽤⼾的操作做出反应。因此,==信号的本质就是事件==。如:按钮单击、双击

槽的本质

==槽(Slot)就是对信号响应的函数==。槽就是⼀个函数,与⼀般的 C++ 函数是⼀样的,可以定义在类的任何位置( public、protected 或 private ),可以具有任何参数,可以被重载,也可以被直接调⽤(但是不能有默认参数)。槽函数与⼀般的函数不同的是:==槽函数可以与⼀个信号关联,当信号被发射时,关联的槽函数被⾃动执⾏==。


说明
(1)信号和槽机制底层是通过函数间的相互调⽤实现的。每个信号都可以⽤函数来表⽰,称为信号函数;每个槽也可以⽤函数表⽰,称为槽函数。例如: "按钮被按下" 这个信号可以⽤ clicked() 函数表⽰,"窗⼝关闭" 这个槽可以⽤ close() 函数表⽰,假如使⽤信号和槽机制-实现:"点击按钮会关闭窗⼝" 的功能,其实就是 clicked() 函数调⽤ close() 函数的效果。
(2)信号函数和槽函数通常位于某个类中,和普通的成员函数相⽐,它们的特别之处在于:
• 信号函数⽤ signals 关键字修饰,槽函数⽤ public slots、protected slots 或者 private slots 修
饰。signals 和 slots 是 Qt 在 C++ 的基础上扩展的关键字,专⻔⽤来指明信号函数和槽函数;
• 信号函数只需要声明,不需要定义(实现),⽽槽函数需要定义(实现)

信号与槽的连接

在 Qt 中,QObject 类提供了⼀个静态成员函数 connect() ,该函数专门用来关联指定的信号函数和槽函数。

connect() 函数原型:
connect (const QObject sender,
const char
signal ,
const QObject receiver ,
const char
method ,
Qt::ConnectionType type = Qt::AutoConnection )

参数说明:
• sender:信号的发送者;
• signal:发送的信号(信号函数);
• receiver:信号的接收者;
• method:接收信号的槽函数;
• type: ⽤于指定关联⽅式,默认的关联⽅式为 Qt::AutoConnection,通常不需要⼿动设定。

自定义槽函数

==此处演示槽函数自定义的过程,信号函数不需要自定义,采用Qt内置的信号,后续会演示自定义信号的过程==
新建项目后,在==widget.h==中添加槽函数声明
在这里插入图片描述
在==widget.cpp==文件中添加槽函数的定义,以及用connect连接信号与槽函数
在这里插入图片描述
信号:clicked (即点击事件)槽函数:Widget::handleClicked,

connect(button, &QPushButton::clicked, this, &Widget::handleClicked);
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
   
    ui->setupUi(this);
    QPushButton* button = new QPushButton(this);    
    button->setText("按钮");
    button->move(100, 100); //将按钮的位置设定为 (100, 100),相对于其父窗口的坐标系
    connect(button, &QPushButton::clicked, this, &Widget::handleClicked);
}

Widget::~Widget()
{
   
    delete ui;
}

void Widget::handleClicked()
{
   
    //按下按钮,修改窗口标题
    this->setWindowTitle("按钮已经被按下");
}

以上就是需要做的所有修改,现在运行一下看结果——窗口标题发生改变
在这里插入图片描述

采用图形化方式再来演示一下以上内容

新建一个项目,然后拖拽一个button到界面上,鼠标右键转到槽
在这里插入图片描述
选择clicked()即点击事件,对于普通按钮来说, 使⽤ clicked 信号即可. clicked(bool) 没有意义的. 具有特殊状态的按钮(⽐如复选按钮)才会⽤到 clicked(bool)

在这里插入图片描述
==头文件widget.h中Qt会自动给我们添加槽函数声明==
在这里插入图片描述

==在 "widget.cpp" 中⾃动⽣成槽函数定义==
在这里插入图片描述
⾃动⽣成槽函数的名称有⼀定的规则。槽函数的命名规则为:on_XXX_SSS,其中:
1、以 " on " 开头,中间使⽤下划线连接起来;
2、" XXX " 表⽰的是对象名(控件的 objectName 属性)。
3、" SSS " 表⽰的是对应的信号。
如:" on_pushButton_clicked() " ,pushButton 代表的是对象名,clicked 是对应的信号。
==只用做以下修改,on_pushButton_clicked完善槽函数即可==

void Widget::on_pushButton_clicked()
{
   
    this->setWindowTitle("按钮已经按下");
}

运行观察结果
在这里插入图片描述

小结

今日的分享就到这里了,下一篇将会向你介绍如何自定义信号

目录
相关文章
|
1月前
|
编译器
(9)Qt中信号与槽重载的解决方案
本文介绍了在Qt中处理信号与槽重载问题的三种解决方案:使用函数指针、Qt提供的QOverload类和Qt4的宏方式。
99 3
|
6月前
|
存储 安全 编译器
【Qt 底层机制之信号和槽 】深入探究Qt信号和槽背后的原理
【Qt 底层机制之信号和槽 】深入探究Qt信号和槽背后的原理
1951 4
|
6月前
【Qt 学习笔记】按钮实现helloworld | 信号与槽概述
【Qt 学习笔记】按钮实现helloworld | 信号与槽概述
82 0
|
6月前
|
编译器 C++ 开发者
QT基础【7-跨进程发送信号】
QT基础【7-跨进程发送信号】
|
6月前
|
存储 API C++
【Qt 信号槽】深入探索 Qt 信号和槽机制中的引用传递“ (“A Deep Dive into Reference Passing in Qt Signal and Slot Mechanism“)
【Qt 信号槽】深入探索 Qt 信号和槽机制中的引用传递“ (“A Deep Dive into Reference Passing in Qt Signal and Slot Mechanism“)
533 0
|
6月前
|
安全 编译器 开发者
【Qt 学习笔记】Qt信号和槽的其他说明及Lambda表达式
【Qt 学习笔记】Qt信号和槽的其他说明及Lambda表达式
206 0
|
1月前
(8)Qt中的自定义信号
本文介绍了如何在Qt框架中创建和使用自定义信号,并通过一个父子窗口切换的示例来展示自定义信号的实现和应用。
69 3
(8)Qt中的自定义信号
|
5月前
|
安全 C++ Windows
Qt信号与槽机制
Qt信号与槽机制
52 1
|
3月前
|
程序员 C++
【Qt】信号与槽(下)
【Qt】信号与槽(下)
|
3月前
|
Linux C++
【Qt】信号与槽(上)
【Qt】信号与槽(上)
【Qt】信号与槽(上)