我有两个简单的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";
}
我正在尝试将signal
中的class A
与slot
中的class B
相关联,但是根据我提供的代码,它无效。
那么正确的方法是什么?
谢谢
修改:
根据PRIME的回答,我做了一些改变。
在A的构造函数中,添加了:
connect(testBtn, &QPushButton::clicked, [this](){OnButtonClicked();});
发出自己定义的OnButtonClicked()
signal
;
在B的建设者中,改为:
connect(&testingA, &A::OnButtonClicked, this, &B::testing);
但是当我点击该按钮时,testing
slot
仍未触发。
编辑2:
在做了一些研究并尝试了几次之后,我发现如果我在B
的{{1}}中创建object
的{{1}},然后连接A
在constructor
中向A
的{{1}}发出信号,它会起作用。
但我真的无法弄清楚为什么我无法将B
的信号连接到slot
的{{1}} A
。
这就是A
:
B
这是因为某些原因导致slot
的{{1}}对象超出范围吗?
有人能告诉我哪里做错了吗?非常感谢。
答案 0 :(得分:2)
不要这样做,在A类中隐藏你的按钮,从A类发出你自己定义的信号,让我们把它叫做OnButtonClicked。
级联代码(在A&#39; s内):
connect(testBtn , &QPushButton::clicked, [this](){OnButtonClicked();});
您现在还必须在A类中声明这个新信号: 所以除了现在的A级之外,A级必须拥有以下内容:
class A
{
Q_OBJECT
signals:
void OnButtonClicked();
};
由于您使用Lambda作为信号OnButtonClicked的插槽,因此无需特殊插槽。
B级连接(在c&C;中执行):
connect(testingA, &A::OnButtonClicked, this, &B::testing);
答案 1 :(得分:2)
您可以在发件人对象中连接信号到信号,例如包含按钮的小部件:
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);