QT信号的多级传递


前言

使用单例来实现信号的中转

就Qt的信号和槽机制来说,如果存在A>B>C>D的信号传递过程,但是实际上我们不需要BC接受信号,我可以实现一个单例来E来中转变成A>E>D,这样操作后无论有多少级都可以实现只要传递一次即可。


提示:以下是本篇文章正文内容,下面案例可供参考

一、中转类

.h文件

#ifndef TRANSMITSIGNALS_H
#define TRANSMITSIGNALS_H

#include <QObject>
#include<whatplantchoose.h>

class TransmitSignals : public QObject
{
    Q_OBJECT
public:
    static TransmitSignals &GetInstance();
private:
    TransmitSignals();
     ~TransmitSignals();

    TransmitSignals(const TransmitSignals &) = delete;//禁止拷贝
    TransmitSignals(const TransmitSignals &&) = delete;//禁止移动赋值
    TransmitSignals &operator=(const TransmitSignals &) = delete;//禁止赋值
signals:
    void PlantChooseSin(whatPlantChoose enumValue);
    void productSun(int x,int y);
    void productWd(int x,int y);

public slots:
};

#endif // TRANSMITSIGNALS_H

.cpp

#include "transmitsignals.h"
//单例类的使用及创建
TransmitSignals::TransmitSignals( )
{

}

TransmitSignals::~TransmitSignals( )
{

}
TransmitSignals& TransmitSignals::GetInstance()
{
    static TransmitSignals RobotControl;
    return RobotControl;
}

二、用法

将需要绑定的信号绑定上去
connect(this, &ChoosePlant::PlantChooseSin,&TransmitSignals::GetInstance(), &TransmitSignals::PlantChooseSin );
从中转类中取出信号
connect(&TransmitSignals::GetInstance(),&TransmitSignals::PlantChooseSin, this,&Game::dealChoosePlant);

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,信号槽机制是一种用于对象之间通信的机制。通过信号槽,一个对象可以发出信号,而其他对象可以通过连接到该信号的槽函数来接收这个信号。 在信号槽的连接中,可以传递参数。传递参数可以通过两种方式实现: 1. 使用信号槽的默认参数: 在定义信号时,可以为信号的参数提供默认值。当槽函数连接到该信号时,如果没有提供参数,将使用默认值。示例代码如下: ```cpp class MyObject : public QObject { Q_OBJECT signals: void mySignal(int value = 0); public slots: void mySlot(int value); }; void MyObject::mySlot(int value) { // 处理接收到的值 } // 连接信号和槽 MyObject obj; connect(&obj, &MyObject::mySignal, &obj, &MyObject::mySlot); // 发射信号 emit obj.mySignal(42); // 使用提供的参数值 ``` 2. 使用QSignalMapper类: QSignalMapper类可以将一个信号映射到多个槽函数,并且可以传递参数。示例代码如下: ```cpp class MyObject : public QObject { Q_OBJECT signals: void mySignal(int value); public slots: void mySlot(int value); }; void MyObject::mySlot(int value) { // 处理接收到的值 } // 创建信号映射器 QSignalMapper* mapper = new QSignalMapper(this); // 创建多个槽函数 MyObject obj1; MyObject obj2; // 连接信号映射器的信号到槽函数 connect(mapper, SIGNAL(mapped(int)), &obj1, SLOT(mySlot(int))); connect(mapper, SIGNAL(mapped(int)), &obj2, SLOT(mySlot(int))); // 连接信号信号映射器的槽函数 connect(&obj1, SIGNAL(mySignal(int)), mapper, SLOT(map())); connect(&obj2, SIGNAL(mySignal(int)), mapper, SLOT(map())); // 发射信号传递参数 emit mapper->mapped(42); // 发射信号,并传递参数 ``` 这两种方式都可以在信号槽的连接中传递参数,你可以根据具体需求选择适合的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值