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

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

我有两个简单的classes(class Aclass B)。
a.h中,我刚刚声明了QPushButton

1
QPushButton *testBtn = new QPushButton(this);

b.h中:

1
2
3
4
5
6
7
8
9
class B : public QMainWindow
{
    Q_OBJECT
public:
    explicit B(QWidget *parent = nullptr);
    A testingA;
public slots:
    void testing();
};

b.cpp

1
2
3
4
5
6
7
8
9
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的构造函数中,添加:

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

发出自己定义的OnButtonClicked() signal;
在B的构造函数中更改为:

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

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

编辑2:
经过一些研究并尝试了几次之后,我发现如果我在Aconstructor中创建了Bobject,然后将A的信号连接到B的< A中的x9>,它将起作用。
但是我真的无法弄清楚为什么不能将A的信号连接到B中的Bslot
这是main.cpp中的内容:

1
2
3
4
5
6
7
8
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    B b;
    A w;
    w.show();
    return a.exec();
}

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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关键字发送信号,例如:

1
emit buttonClicked();

然后,消费者:

1
2
3
4
5
6
7
8
9
10
11
12
class TestObject : public QObject
{
    Q_OBJECT
public:
    explicit TestObject(QObject *parent = nullptr) : QObject(parent) { }

public slots:

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

并连接两个实例:

1
2
3
4
MyWidget widget;
TestObject to;

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

不要这样,将按钮隐藏在类A中,从类A发出自己定义的信号,将其称为OnButtonClicked。

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

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

您还必须现在在A类中声明此新信号:
因此,A类除了现在拥有的以外,还必须具备以下条件:

1
2
3
4
5
6
class A
{
Q_OBJECT
signals:
    void OnButtonClicked();
};

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

B类中的连接(在c'tor中完成):

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