How to connect signal and slot in different classes in Qt?
我有两个简单的
在
1 | QPushButton *testBtn = new QPushButton(this); |
在
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(); }; |
和
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"; } |
我正在尝试将
那么正确的方法是什么呢?谢谢
编辑:
根据PRIME的回答,我做了一些更改。
在A的构造函数中,添加:
1 | connect(testBtn, &QPushButton::clicked, [this](){OnButtonClicked();}); |
发出自己定义的
在B的构造函数中更改为:
1 | connect(&testingA, &A::OnButtonClicked, this, &B::testing); |
但是当我单击按钮时,
编辑2:
经过一些研究并尝试了几次之后,我发现如果我在
但是我真的无法弄清楚为什么不能将
这是
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(); } |
是否由于某些原因
有人可以告诉我我做错了什么吗?非常感谢。
您可以在发送方对象中连接信号到信号,例如包含按钮的小部件:
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: }; |
顺便说一句,您通常使用
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); |