QT 信号槽之一:九种基础调用方式

本文详细介绍了Qt中的信号槽机制,包括connect和disconnect函数的使用,固定信号槽、自定义信号槽的创建及连接,信号连接信号、多个信号连接一个槽函数、一个信号连接多个槽函数的场景,以及信号参数和槽参数的数量匹配规则。通过实例演示了各种信号槽的使用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前提

基础

connect函数

disconnect函数

函数指针

 lambda

信号槽使用

1.固定信号槽的使用

自定义按钮:Button

使用信号槽

2.固定的信号槽使用,使用父类

3.自定义信号槽,无重载信号槽时

自定义信号类:teacher

自定义槽类:student

使用自定义信号槽

4.自定义信号槽,有重载信号槽时,带参信号槽,函数指针

5.信号连接信号

6.多个信号可以连接一个槽函数

7.一个信号可以连接多个槽函数

8.信号参数个数可以多于槽参数个数,但是类型顺序必须相同:

9.lambda表达式实现槽函数


前提

环境:Qt Creator 5.0.1,Qt 6.1.3

背景描述:信号槽机制,是qt中最基础的消息机制,下面的使用方式,都是基于qt6的最基础使用方式(扩展使用方式以后再慢慢补充)包括:

  1. 固定的信号槽使用
  2. 固定的信号槽使用,使用父类
  3. 自定义信号槽,无重载信号槽时
  4. 自定义信号槽,有重载信号槽时,带参信号槽,函数指针
  5. 信号连接信号
  6. 多个信号可以连接一个槽函数
  7. 一个信号可以连接多个槽函数
  8. 信号参数个数可以多于槽参数个数,但是类型顺序必须相同
  9. 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

        Lambda表达式语法 | Microsoft Docs

        在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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值