【Qt】02-信号与槽函数
发生的原因与事件
- 前言
- 一、什么是信号与槽(Signals and Slots)?
- 1.1 信号(Signals)
- 1.2 槽(Slots)
- 1.3 连接方式
- 二、调用基本的信号与槽函数
- 2.1 代码
- 分析connect()的用法
- 2.2 结果展示
- 三、自定义槽函数
- 3.1 代码
- released的用法
- 3.2 现象展示
- 总结
前言
介绍了QT的信号与槽函数
一、什么是信号与槽(Signals and Slots)?
1.1 信号(Signals)
定义:信号是对象发出的通知,表示某个特定的事件发生了。
例如,当用户点击一个按钮时,按钮对象会发出一个clicked信号。
特点:
- 信号是在类中声明的,通常在类的signals部分声明。
- 信号的声明类似于普通函数的声明,但不需要实现(即不需要定义函数体)。
- 信号的发出是通过emit关键字实现的。例如,emit buttonClicked();。
- 信号可以携带参数,这些参数可以传递事件相关的数据。
1.2 槽(Slots)
定义:槽是普通的成员函数,可以被信号触发。当某个信号被发出时,与该信号连接的槽函数会被自动调用。
特点:
- 槽函数可以是任何普通的成员函数,也可以是静态函数。
- 槽函数的声明和实现与普通成员函数相同。
- 槽函数可以被多个信号连接,也可以不被任何信号连接。
- 槽函数可以有参数,这些参数必须与连接的信号的参数匹配。
1.3 连接方式
信号和槽之间的连接是通过connect函数
实现的。
二、调用基本的信号与槽函数
2.1 代码
其中,不在main函数做任何修改
- mywidget.cpp
#include "mywidget.h"
#include <QPushButton>
// 构造函数
// 调用基类 QWidget 的构造函数,将 parent 参数传递给它
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
button1.setParent(this);
button1.setText("colse1");
button1.move(100,100);
button2 = new QPushButton(this); // 指针动态分配空间
button2->setText("colse2");
button2->move(300,100);
// 槽函数
connect(&button1,&QPushButton::pressed,this,&MyWidget::close);
connect(button2,&QPushButton::pressed,this,&MyWidget::close);
}
// 析构函数
MyWidget::~MyWidget()
{
}
- mywidget.h
然后就可以实现两个按键都能关闭界面的功能。
分析connect()的用法
bool QObject::connect(const QObject *sender, const char *signal,
const QObject *receiver, const char *member,
Qt::ConnectionType type = Qt::AutoConnection);
参数解释:
1.sender
:发出信号的对象。【这里有一个值得注意的是,是要传入一个地址类型的】
2.signal
:要连接的信号的名称。信号的名称格式为SIGNAL(signalName),其中signalName是信号的名称。
3.receiver
:接收信号并调用槽函数的对象。
4.member
:要调用的*槽函数的名称*
。槽函数的名称格式为SLOT(slotName),其中slotName是槽函数的名称。
5.type
:连接类型,可以是Qt::AutoConnection、Qt::DirectConnection、Qt::QueuedConnection等。默认值是Qt::AutoConnection。
2.2 结果展示
不做展示了,总之就是点击两个按键,界面就被关闭了OuO
三、自定义槽函数
槽函数需要和信号一致(返回值、参数)
由于信号都没有返回值,所以,槽函数一定没有返回值。
3.1 代码
依旧没涉及到的函数不做改变。
mywidget.cpp
#include "mywidget.h"
#include <QPushButton>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
button1.setParent(this);
button1.setText("colse1");
button1.move(100,100);
button2 = new QPushButton(this); // 指针动态分配空间
button2->setText("点击我");
button2->move(300,100);
button3 = new QPushButton(this);
button3->setText("请点击我");
button3->move(300,128);
connect(&button1,&QPushButton::pressed,this,&MyWidget::close);
connect(button2,&QPushButton::released,this,&MyWidget::mySolt);
// 注意,接受槽的对象变成来button1,点击就会隐藏button1
connect(button3,&QPushButton::released,&button1,&MyWidget::hide);
}
void MyWidget::mySolt()
{
button2->setText("hello");
}
// 析构函数
MyWidget::~MyWidget()
{
}
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QPushButton>
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = 0);
~MyWidget();
void mySolt();
private:
QPushButton button1;
QPushButton *button2; // 指针
QPushButton *button3;
};
#endif // MYWIDGET_H
released的用法
也就是抬起按键
3.2 现象展示
close1(button1)点击后关闭界面。不展示
button2点击之后,改变按键上显示的文字
button3点击之后,隐藏掉button1。
总结
这篇文章依旧没有总结