如何在 Qt 中连接不同 类 中的信号和插槽?

How to connect signal and slot in different classes in Qt?

我有两个简单的 classesclass Aclass B)。
a.h 中,我刚刚声明了一个 QPushButton:

QPushButton *testBtn = new QPushButton(this);

b.h中:

class B : public QMainWindow
{
    Q_OBJECT
public:
    explicit B(QWidget *parent = nullptr);
    A testingA;
public slots:
    void testing();
};

b.cpp:

B::B(QWidget *parent) : QMainWindow(parent)
{
    connect(testingA.testBtn, &QPushButton::clicked, this, &B::testing);
}

void B::testing()
{
    qDebug() << "testing";
}

我正在尝试将 class A 中的 signal 连接到 class B 中的 slot,但是根据我提供的代码,它不起作用。

那么正确的做法是什么?
谢谢

编辑:
根据PRIME的回答,我做了一些修改。
在 A 的构造函数中,添加:

connect(testBtn, &QPushButton::clicked, [this](){OnButtonClicked();});

发出自己定义的 OnButtonClicked() signal;

在 B 的构造函数中,改为:

connect(&testingA, &A::OnButtonClicked, this, &B::testing); 

但是当我点击按钮时,testing slot 仍然没有触发。

编辑 2:
在做了一些研究并尝试了几次之后,我发现如果我在 Aconstructor 中创建 Bobject,然后连接 AA 中向 Bslot 发出的信号,它将起作用。
但是我真的想不通为什么我无法将A的信号连接到B中的Bslot
这是 main.cpp:

中的内容
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    B b;
    A w;
    w.show();
    return a.exec();
}

是否因为某些原因 A 的对象超出了 B 的范围?
有人可以告诉我我哪里做错了吗?非常感谢。

不要这样做,将你的按钮隐藏在 class A 中,从 class A 发出你自己定义的信号让我们称之为 OnButtonClicked。

级联代码(在 A 的 c'tor 内):

connect(testBtn , &QPushButton::clicked, [this](){OnButtonClicked();});

您现在还必须在 class A 中声明这个新信号: 所以 class 除了现在拥有的东西,A 还必须拥有以下东西:

class A
{
Q_OBJECT
signals:
    void OnButtonClicked();
};

不需要特殊插槽,因为您使用 Lambda 作为信号 OnButtonClicked 的插槽。

class 中的连接 B(在 c'tor 中执行):

connect(testingA, &A::OnButtonClicked, this, &B::testing);

您可以在发送者对象中连接信号到信号,例如包含按钮的小部件:

class MyWidget : public QWidget
{
    Q_OBJECT
    QPushButton *pushButton;
public:
    explicit MyWidget(QWidget *parent = nullptr) : QWidget(parent), pushButton(new QPushButton(this)) {
        connect(pushButton, &QPushButton::click, this, &MyWidget::buttonClicked);
    }

signals:

    void buttonClicked();

public slots:
};

顺便说一下,您通常会使用 emit 关键字发送信号,例如:

emit buttonClicked();

那么消费者:

class TestObject : public QObject
{
    Q_OBJECT
public:
    explicit TestObject(QObject *parent = nullptr) : QObject(parent) { }

public slots:

    void onButtonClicked() {
        qDebug() << "clicked";
    }
};

并连接两个实例:

MyWidget widget;
TestObject to;

QObject::connect(&widget, &MyWidget::buttonClicked, &to, &TestObject::onButtonClicked);

在你的 class A 中,你应该使用 class B 的信号 testing,如果你点击你的按钮,OnButtonClicked 函数将被激活

A:
public slots:
    void OnButtonClicked();

void A::OnButtonClicked()
{
    ...
    emit testing(1);
}

B:
signals:
    void testing(int level);

然后连接两者,你可以这样做

connect(startButton, &QPushButton::clicked, board, &A::OnButtonClicked);