如何连接Qt中不同级别的信号和插槽?
我有两个简单的如何连接Qt中不同级别的信号和插槽?,qt,signals-slots,Qt,Signals Slots,我有两个简单的类(A类和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.
类
(A类
和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";
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
B b;
A w;
w.show();
return a.exec();
}
发出自己定义的OnButtonClicked()
信号
在B的结构中,改为:
connect(&testingA, &A::OnButtonClicked, this, &B::testing);
但当我点击按钮时,测试
插槽
仍未触发。编辑2:
在做了一些研究并尝试了几次之后,我发现如果我在
a
的构造函数中创建B
的对象,然后将a
的信号连接到a
中的插槽,它就会工作
但是我真的不明白为什么我不能把A
的信号连接到B
的插槽
这是main.cpp中的内容:
B::B(QWidget *parent) : QMainWindow(parent)
{
connect(testingA.testBtn, &QPushButton::clicked, this, &B::testing);
}
void B::testing()
{
qDebug() << "testing";
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
B b;
A w;
w.show();
return a.exec();
}
是不是因为某种原因,A
的对象超出了B
的范围?
谁能告诉我哪里做错了?非常感谢。不要这样做,将您的按钮隐藏在类A中,从类A发出您自己定义的信号,让我们将其称为OnButtonClicked
级联代码(在c'tor中):
您现在还必须在A类中声明此新信号:
因此,A级除了现在拥有的以外,还必须具备以下几点:
class A
{
Q_OBJECT
signals:
void OnButtonClicked();
};
不需要特殊插槽,因为您使用Lambda作为信号ON按钮CLICKED的插槽
B类连接(在c'tor中进行):
不要这样做,在类A中隐藏你的按钮,从类A发出你自己定义的信号,让我们调用OnButtonClicked
级联代码(在c'tor中):
您现在还必须在A类中声明此新信号:
因此,A级除了现在拥有的以外,还必须具备以下几点:
class A
{
Q_OBJECT
signals:
void OnButtonClicked();
};
不需要特殊插槽,因为您使用Lambda作为信号ON按钮CLICKED的插槽
B类连接(在c'tor中进行):
您可以将sender对象中的信号连接到信号,例如,包含按钮的小部件:
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";
}
};
您可以将sender对象中的信号连接到信号,例如,包含按钮的小部件:
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";
}
};
我尝试了您提供的方法,但我遇到了以下错误:没有匹配的函数用于调用“B::connect(A&,void(A:*)(),B*,void(B:*)())”connect(testingA,&A::OnButtonClicked,this,&B::testing)代码>,这是为什么?@TheodoreTang:您是否在一个文件的标题中声明了信号“OnButtonClicked”?请参阅编辑。我尝试了您提供的方法,但出现了以下错误:没有匹配函数用于调用“B::connect(A&,void(A:*)(),B*,void(B:*)()”connect(testingA,&A::OnButtonClicked,this,&B::testing)代码>,这是为什么?@TheodoreTang:您是否在一个文件的标题中声明了信号“OnButtonClicked”?查看编辑。您有两个类对象A
:testingA
和w
?@eyllansc,是的,我在B
的构造函数中声明了testingA
对象,以便连接B
的构造函数中的A
信号。“这有什么不对劲吗?@eyllanesc我想我知道我现在哪里做错了。我删除了A
的对象w,在B
的构造函数中创建了一个testingA
,并将其显示在屏幕上。然后它工作了。如果您在继承自QObject
的类的实现中,例如小部件只是connect(发送方,&ClaseSender::signal,接收方,&ClaseReceiver::slot_和_或_signal)
,那么您可以在这两个对象都存在的地方建立连接,iif如果您在继承自QObject的类(例如main.cpp)的实现之外,则必须执行以下操作:QObject::connect(发送方和类发送方::信号、接收方和类接收方::插槽和信号)
阅读以下内容以了解更多详细信息:您有两个类对象A
:testingA
和w
?@eyllansc,是的,我在B
的构造函数中声明了一个testingA
对象,以便连接A
的信号B
的构造函数。“这有什么不对劲吗?@eyllanesc我想我知道我现在哪里做错了。我删除了A
的对象w,在B
的构造函数中创建了一个testingA
,并将其显示在屏幕上。然后它工作了。如果您在继承自QObject
的类的实现中,例如小部件只是connect(发送方,&ClaseSender::signal,接收方,&ClaseReceiver::slot_和_或_signal)
,那么您可以在这两个对象都存在的地方建立连接,iif如果您在继承自QObject的类(例如main.cpp)的实现之外,则必须执行以下操作:QObject::connect(发送方和类发送方::信号、接收方和类接收方::插槽和\u或\u信号)
阅读以下内容以了解更多详细信息: