QT 自定义信号和槽

          好久没有静下心来思考了,每天靠工作驱动,忙碌但不踏实。QT信号与槽机制一直在用,也会用,但只是知其然不知其所以然。今天临近下班给自己点清醒的时间,详细了解了下,总结如下:

信号与槽机制是QT中不同对象相互通信的一种方法。

有两种写法:第一种是SIGNAL()和SLOT()宏,第二种是&App::member 函数指针

宏方式:connect(obj1, SIGNAL(signal(int)), obj2, SLOT(slot()))
对象方式:connect(obj1, &Obj1::signal, obj2, &Obj2::slot)

马上下班了,以主管说下班吧,作为苦逼的我们赶紧关机走人为为例。主管发出下班的信息。程序中创建BOSS类,并自定义信号void gooffwork(),信号不需要实现

#ifndef BOSS_H
#define BOSS_H

#include <QObject>

class BOSS : public QObject
{
    Q_OBJECT
public:
    explicit BOSS(QObject *parent = 0);

signals:
    
    void gooffwork(QString name);

public slots:
};

#endif // BOSS_H

自定义STAFF类,定义槽函数 void turnoff(Qstring name),槽函数必须实现

#include "staff.h"

STAFF::STAFF(QObject *parent) : QObject(parent)
{

}

void STAFF::turnoff(Qstring name)
{
    qDebug()<<name+"---关机走人!";
}
#ifndef STAFF_H
#define STAFF_H

#include <QObject>

class STAFF : public QObject
{
    Q_OBJECT
public:
    explicit STAFF(QObject *parent = 0);

signals:

public slots:
    void turnoff(QString name);
};

#endif // STAFF_H

在主程序中定义BOSS和STAFF对象

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "boss.h"
#include "staff.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

signals:
  

private slots:
    void on_pushButton_clicked();
    

private:
    Ui::Widget *ui;

    BOSS *boss;   //定义BOSS对象
    STAFF *staff; //定义STAFF对象


};

#endif // WIDGET_H

以两种方式创建信号与槽的连接

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    boss=new BOSS(this);
    staff=new STAFF(this);
    connect(boss,SIGNAL(gooffwork(QString)),staff,SLOT(turnoff(QString)));  //方式一
//    connect(boss,&BOSS::gooffwork,staff,&STAFF::turnoff);                 //方式二
}

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

void Widget::on_pushButton_clicked()
{

     emit boss->gooffwork("张三");// 按钮点击的时候,boss发送下班信号
}

运行结果:

 

下班走人。。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
QT中的信号机制是QT框架核心的一个特性。它提供了一种在对象之间进行通信的简洁、高效的方式。自定义信号是在QT中扩展信号机制的一种方式,可以灵活地将自定义信号连接到相应的函数上。 在QT中,自定义信号的示例可以如下所示: ```cpp #include <QObject> #include <QPushButton> class MyButton : public QPushButton { Q_OBJECT public: MyButton(QWidget *parent = nullptr) : QPushButton(parent) {} signals: void clickedWithMessage(const QString& message); // 自定义信号 public slots: void onClicked() // 函数 { emit clickedWithMessage("Button is clicked!"); // 发射自定义信号,并传递消息 } }; class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) { MyButton *button = new MyButton(this); connect(button, &MyButton::clickedWithMessage, this, &MyWidget::onButtonClicked); // 连接自定义信号函数 } public slots: void onButtonClicked(const QString& message) // 函数 { qDebug() << "Received message:" << message; } }; ``` 在这个示例中,我们自定义了一个派生自QPushButton的类MyButton,并在其中声明了一个自定义信号`clickedWithMessage`。当按钮被点击时,会发射该自定义信号,并传递一个消息。 然后,在MyWidget的构造函数中,我们创建了一个MyButton实例,通过`connect`函数将该按钮的自定义信号与MyWidget的函数`onButtonClicked`进行连接。 当按钮被点击时,MyWidget的函数`onButtonClicked`会被调用,接收到传递的消息并打印出来。 通过自定义信号,我们可以自由地在不同的对象之间实现消息的传递与处理,使得代码更加模块化和可维护。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值