当前位置:网站首页>Qt不同类之间建立信号槽,并传递参数

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

2022-07-07 22:20:00 妙为

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();
}

运行
在这里插入图片描述

源码下载

源码下载

原网站

版权声明
本文为[妙为]所创,转载请带上原文链接,感谢
https://blog.csdn.net/aoxuestudy/article/details/125647462