Qt不同类之间建立信号槽,并传递参数

博客围绕Qt不同类之间信号槽使用展开。假设有A、B、C三个类,A类和B类相互传递数据,C类负责控制和管理A、B类。介绍了A类的头文件和实现文件,还涉及C类及调用类,最后提供了源码下载。

Qt系列文章目录

前言

最近遇到这种情况:假设有3个类:A,B,C
A类和B类之间相互传递数据,而C类负责控制A类和B类,换句话说,C类管理着A类和B类。
Qt不同类之间建立信号槽,并传递参数

一.A类:TestA

1.头文件和实现文件

#ifndef TESTA_H
#define TESTA_H

#include <QObject>

class TestA : public QObject
{
    Q_OBJECT
public:
    explicit TestA(QObject *parent = nullptr);
    void emitDataFromTestA();

signals:
    void sendDataFromTestA(const char* data);
public slots:
    void recvDataAtTestA(const char* data);
    
};

#endif // TESTA_H


```cpp
#include "TestA.h"
#include <QDebug>

TestA::TestA(QObject *parent) : QObject(parent)
{

}

void TestA::emitDataFromTestA()
{
    const char* name = "Data from testA";
    emit sendDataFromTestA(name);
}

void TestA::recvDataAtTestA(const char *data)
{
//    QString print = data;
//    qDebug() << print.toLatin1();
    qDebug() << "TestA class recive data:" << data;
}




# 二、B类:TestB

```cpp
#ifndef TESTB_H
#define TESTB_H

#include <QObject>

class TestB : public QObject
{
    Q_OBJECT
public:
    explicit TestB(QObject *parent = nullptr);
    void emitDataFromTestB();
signals:
    void sendDataFromTestB(const char* data);
public slots:
    void recvDataAtTestB(const char* data);
    
};

#endif // TESTB_H

#include "TestB.h"
#include <QDebug>

TestB::TestB(QObject *parent) : QObject(parent)
{

}

void TestB::emitDataFromTestB()
{
    const char* name = "Data from testB";
    emit sendDataFromTestB(name);

}

void TestB::recvDataAtTestB(const char *data)
{
    qDebug() << "TestB class recive data:" << data;
}

三 C类:控制A和B的类

#ifndef CONTROL_H
#define CONTROL_H

#include <QObject>
#include "TestA.h"
#include "TestB.h"

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

public:
    TestA* m_pTestA;
    TestB* m_pTestB;

    void controlSendData();

signals:

};

#endif // CONTROL_H

#include "Control.h"

Control::Control(QObject *parent) : QObject(parent)
{
    m_pTestA = new TestA;
    m_pTestB = new TestB;

    QObject::connect(m_pTestA, &TestA::sendDataFromTestA, m_pTestB, &TestB::recvDataAtTestB);
    QObject::connect(m_pTestB, &TestB::sendDataFromTestB, m_pTestA, &TestA::recvDataAtTestA);
}

Control::~Control()
{
    if(m_pTestA)
    {
        delete  m_pTestA;
        m_pTestA = nullptr;
    }
    if(m_pTestB)
    {
        delete m_pTestB;
        m_pTestB = nullptr;
    }
}

void Control::controlSendData()
{
    m_pTestA->emitDataFromTestA();
    m_pTestB->emitDataFromTestB();
}

四 调用类

#include "MainWindow.h"
#include "TestA.h"
#include "TestB.h"
#include "Control.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
//    TestA testA;
//    TestB testB;
//    a.connect(&testA, &TestA::sendDataFromTestA, &testB, &TestB::recvDataAtTestB);
//    testA.emitDataFromTestA();

//    a.connect(&testB, &TestB::sendDataFromTestB, &testA, &TestA::recvDataAtTestA);
//    testB.emitDataFromTestB();
    Control control;
    control.controlSendData();

    MainWindow w;
    w.show();
    return a.exec();
}

运行
在这里插入图片描述

源码下载

源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值