目录
前提
环境:Qt Creator 5.0.1,Qt 6.1.3
背景描述:信号槽机制,是qt中最基础的消息机制,下面的使用方式,都是基于qt6的最基础使用方式(扩展使用方式以后再慢慢补充)包括:
- 固定的信号槽使用
- 固定的信号槽使用,使用父类
- 自定义信号槽,无重载信号槽时
- 自定义信号槽,有重载信号槽时,带参信号槽,函数指针
- 信号连接信号
- 多个信号可以连接一个槽函数
- 一个信号可以连接多个槽函数
- 信号参数个数可以多于槽参数个数,但是类型顺序必须相同
- lambda表达式实现槽函数
入门学习资料来源:最新QT从入门到实战完整版|传智教育_哔哩哔哩_bilibili
基础
connect函数
connect(发送者,信号,接受者,槽)
翻译下就是:
connect(调用对象地址,调用对象的函数指针,目标对象地址,目标对象的函数指针)
disconnect函数
disconnect(调用对象地址,调用对象的函数指针,目标对象地址,目标对象的函数指针)
函数指针
顾名思义,函数指针 说的就是 函数的指针,c++中的基础概念,这里简单说下普通函数和成员函数的函数指针的一般形式,后面做信号重载的时候会用到。
// 函数指针简单使用
// 原函数
int testA(float a);
// 函数指针
int(* pfunA)(float) = testA;
// 原成员函数
class testClass{
public:
double testB(int b);
};
// 成员函数指针
double (testClass::* pfunB)(int) = &testClass::testB;
lambda
在C++中Lambda表达式 | Microsoft Docs
信号槽使用
1.固定信号槽的使用
我这的固定信号槽,指的是直接使用QT库类中自带的信号与槽函数,所以我称之为固定的。那么下面使用一个自定义按钮子类。
自定义按钮:Button
button.h
#ifndef BUTTON_H
#define BUTTON_H
#include <QPushButton>
class Button : public QPushButton
{
Q_OBJECT
public:
explicit Button(QWidget *parent = nullptr);
Button(const QString &text, QWidget *parent = nullptr);
virtual ~Button();
signals:
};
#endif // BUTTON_H
button.cpp
#include "button.h"
Button::Button(QWidget *parent) : QPushButton(parent)
{
}
Button::Button(const QString &text, QWidget *parent) : QPushButton(text,parent)
{
}
Button::~Button(){
}
使用信号槽
Widget::Widget(QWidget *parent) : QWidget(parent)
{
// 设置父窗口大小
this->resize(500,700);
// 创建信号槽测试按钮
auto btn = new Button("点我关闭1", this);
btn->setParent(this);
btn->resize(100,100);
btn->move(100,100);
btn->show();
{
qDebug()<<"1、固定的信号槽使用,点击关闭按钮1:";
// 固定信号槽使用
connect(btn, &Button::clicked, this, &Widget::close);
qDebug()<<"\n";
}
}
2.固定的信号槽使用,使用父类
由于信号槽使用的其实是函数指针,那么使用父类的函数指针也必然是可以的。
Widget::Widget(QWidget *parent) : QWidget(parent)
{
// 设置父窗口大小
this->resize(500,700);
// 创建信号槽测试按钮
auto btn = new Button("点我关闭1", this);
btn->setParent(this);
btn->resize(100,100);
btn->move(100,100);
btn->show();
{
qDebug()<<"2、固定的信号槽使用,使用父类,点击关闭按钮2:";
// Button->QPushButton
connect(btn, &am