关于Qt类的继承导致SLOTS函数调用问题

#关于Qt类的继承导致SLOTS函数调用问题
现有普通类A,有.h和.cpp文件;基于QObject的类B,有.h和.cpp文件;基于QObject的类C,有.h、.cpp和ui文件。
C继承于B,B继承于A。
类B有普通函数B2、SLOTS函数SLOTB1。类C有普通函数C2、SLOTS函数SLOTC1。
请问在类C的里如何调用类B的SLOTS函数SLOTB1?connect应该如何链接才行?我是想了很多办法都不行。

【以下回答由 GPT 生成】

由于类B和类C都是基于QObject的类,可以使用Qt的信号和槽机制来连接它们。

在类C的构造函数中,可以使用connect函数来连接类B的SLOTB1函数。具体的代码如下:

// C.h
#include "B.h"

class C : public B
{
    Q_OBJECT

public:
    C();

public slots:
    void SLOTC1();
};

// C.cpp
C::C()
{
    connect(this, SIGNAL(SLOTB1()), this, SLOT(SLOTC1()));
}

void C::SLOTC1()
{
    // 实现类C的SLOTC1的内容
}

这样,当类B中的SLOTB1函数被调用时,它会自动连接到类C中的SLOTC1函数。

请注意,在类B中的SLOTB1函数声明之前,需要添加Q_SIGNALS宏来声明这个函数是一个槽函数。同样,类C中的SLOTC1函数也需要在前面添加Q_SLOTS宏来声明这是一个槽函数。

希望这个解决方案对你有帮助。如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

在Qt中,你可以通过QObject的QObject::connect()函数将信号(signal)连接到槽(slot)上。但是要注意,连接只能在同类的QObject之间进行。也就是说,你不能直接在C中连接B的SLOTS。

一种可能的解决方案是,通过在B中定义一个信号,并在C中连接到该信号。然后在B的SLOTS函数中触发该信号。这样,你就可以在C中通过该信号调用B的SLOTS函数了。

例如:

B.h

#ifndef B_H
#define B_H

#include <QObject>

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

    void B2();
    void SLOTB1();
signals:
    void signalB1();
};

#endif // B_H

B.cpp

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

B::B(QObject *parent) : QObject(parent) {}

void B::B2() {
    // your code here...
}

void B::SLOTB1() {
    // your code here...
    emit signalB1();  // 在SLOTB1中发出信号
}

C.h

#ifndef C_H
#define C_H

#include <QObject>
#include "B.h"  // include B's header file

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

    void C2();
    void SLOTC1();
private slots:  // slots are private by default, make them public if needed
    void onSignalB1();  // slot to handle the signal from B
};

#endif // C_H

C.cpp

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

C::C(QObject *parent) : QObject(parent) {}

void C::C2() {
    // your code here...
}

void C::SLOTC1() {
    // your code here...
}

void C::onSignalB1() {  // slot to handle the signal from B
    qDebug() << "Signal from B received";  // replace with your code...
}

然后,在C中连接B的信号和C的槽:

C::C(QObject *parent) : QObject(parent) {
    connect(this, &C::signalFromB, this, &C::onSignalB1);  // connect signal from B to C's slot onSignalB1()
}

在上面的代码中,我创建了一个名为signalFromB的信号。当这个信号被发出时,onSignalB1槽就会被调用。注意,你需要根据你的具体需求修改这段代码。

SLOTB1设置为public,C都是B的子类了,直接使用就行了。