如何在 Qt 中连接不同 类 中的信号和插槽?
How to connect signal and slot in different classes in Qt?
我有两个简单的 classes
(class A
和 class 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:
在做了一些研究并尝试了几次之后,我发现如果我在 A
的 constructor
中创建 B
的 object
,然后连接 A
在 A
中向 B
的 slot
发出的信号,它将起作用。
但是我真的想不通为什么我无法将A
的信号连接到B
中的B
的slot
。
这是 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);
我有两个简单的 classes
(class A
和 class 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:
在做了一些研究并尝试了几次之后,我发现如果我在 A
的 constructor
中创建 B
的 object
,然后连接 A
在 A
中向 B
的 slot
发出的信号,它将起作用。
但是我真的想不通为什么我无法将A
的信号连接到B
中的B
的slot
。
这是 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);