Qt自定义信号和槽函数的同时重载

本文详细讲解了如何在Qt中自定义信号和槽函数,并实现它们的重载,通过类对象间的连接来触发事件。重点介绍了如何在hello.h和world.h中声明信号和槽,以及在cpp文件中进行连接操作,包括使用函数指针重载。
摘要由CSDN通过智能技术生成

自定义信号和槽函数的同时重载

记录一下,省得一周的小学期又白上…

Signal和Slots相当于软件中一个事件触发的条件与结果。而在QT中,条件与结果常常是某一class的对象中的某个函数,所以使用connection(arg1, arg2, arg3, arg4)来连接二者,一旦arg1对象下的arg2操作实现,则arg3对象下的arg4操作进行。

通常分别建立两个head和cpp来实现这两个对象的构建。

像这样,其中hello.h是声明的signal类,world.h是声明的slots类。分别如下:

hello.h

#ifndef HELLO_H
#define HELLO_H

#include <QObject>
#include <QString>

class hello : public QObject
{
    Q_OBJECT
public:
    explicit hello(QObject *parent = nullptr);

signals:
    void CallWorld();
    void CallWorld(QString mood);   //overload
public slots:

};

#endif // HELLO_H

world.h

#ifndef WORLD_H
#define WORLD_H

#include <QObject>
#include <QString>

class world : public QObject
{
    Q_OBJECT
public:
    explicit world(QObject *parent = nullptr);

signals:


public slots:
    void ReceiveHello();
    void ReceiveHello(QString mood);    //overload
};

#endif // WORLD_H

同时也要在主类中去声明这俩对象。

private:
    Ui::SignalAndSlot *ui;
    hello *he;
    world *wo;
    void Ready();

下面的Ready函数是用来触发条件的。里面一般是调用signal的函数。当然这个函数的实现应该是在cpp中。像这样:

void SignalAndSlot::Ready()
{
    //emit he->CallWorld();
    emit he->CallWorld("happy");
}

至于这个emit,很迷,是个发射signal指令?不懂。

然后就可以在这个cpp文件中进行connection了。注意这里需要重载,重载的操作使用的是函数指针来让connect明确要调用的是哪一个函数。

SignalAndSlot::SignalAndSlot(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::SignalAndSlot)
{
    ui->setupUi(this);
    this->he = new hello(this);
    this->wo = new world(this);
    //connect(he, &hello::CallWorld, wo, &world::ReceiveHello);
    //overload
    void(hello::*helloSignal)(QString) = &hello::CallWorld;
    void(world::*worldSlots)(QString) = &world::ReceiveHello;
    connect(he, helloSignal, wo, worldSlots);
    Ready();
}

另外别忘了include头文件。connect完了这个worldSlots就处于一个待触发的状态了。一旦Ready()触发,它就被调用。

至于word.cpphello.cpp,当然是用来写signal和slots函数了,光在.h声明了也得实现呢。

还有,一直没懂这个main.cpp以外的cpp文件是咋执行的,仔细一想鹊食,其它cpp都是对构造函数的定义,然后main中直接去调用它们的头文件就可以去调用某个类中的函数。原来是这样,我是笨蛋。

总结一下就是基本都是用类对象及其构造函数操作的,找到点感觉了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值