C++ 如何在子类和父类之间添加插槽?
我试图将一个类中的按钮发送的信号与子类和父类的插槽连接起来。下面是一个重现问题的示例: ErrorClass.cppC++ 如何在子类和父类之间添加插槽?,c++,qt,C++,Qt,我试图将一个类中的按钮发送的信号与子类和父类的插槽连接起来。下面是一个重现问题的示例: ErrorClass.cpp #include "errorclass.h" ErrorClass::ErrorClass(QPushButton *button) : QObject() { this->button = button; } void ErrorClass::makeConnectHappen() { connect(button, SIGNAL(pressed())
#include "errorclass.h"
ErrorClass::ErrorClass(QPushButton *button) : QObject()
{
this->button = button;
}
void ErrorClass::makeConnectHappen()
{
connect(button, SIGNAL(pressed()), this, SLOT(exampleSlot()));
}
//SLOT
void ErrorClass::exampleSlot()
{
qDebug() << "ExampleSlot was here";
}
其中,MakeConnectOccess()
是ErrorClass.h中的一个虚拟函数,由ErrorClassChild继承和扩展。我希望这将是明确的
当我编译并运行程序时,会有一条应用程序消息
QObject::connect: No such slot ErrorClass::exampleChildSlot() in ../QListWidgetProblem/errorclasschild.cpp:11
QObject::connect: (sender name: 'pushButton')
现在,当我将exampleChildSlot()
作为纯虚拟插槽放入父级时,错误消失,但没有显示qDebug()
消息
如何使
同时连接到父插槽和子插槽?还是我的想法完全错了?您应该使用虚拟插槽(虚拟插槽):
将这些声明放在基类中
class ErrorClass : public QObject{
Q_OBJECT
//...
void makeConnectHappen();
public slots:
virtual void exampleSlot();
}
然后,完全按照您的方式为基类实现MakeConnectOccess()
,只需重新实现派生类中的插槽即可。然后,当按钮将发出pressed()
信号时,它将触发正确的插槽,具体取决于使用此按钮实例化的对象的类别。您应该使用虚拟插槽(以下选项):
将这些声明放在基类中
class ErrorClass : public QObject{
Q_OBJECT
//...
void makeConnectHappen();
public slots:
virtual void exampleSlot();
}
然后,完全按照您的方式为基类实现MakeConnectOccess()
,只需重新实现派生类中的插槽即可。然后,当按钮将发出pressed()
信号时,它将根据使用此按钮实例化的对象的类别触发正确的插槽。Q\u对象
不是属性,而是宏,因此无法继承。所以,如果您想在类中使用signals插槽(即使它是从类派生的,其中Q_OBJECT
已经是),您应该将它添加到类中。已经讨论过这个主题,所以它可以帮助您。Q_对象
不是属性,它是宏,因此无法继承。所以,如果您想在类中使用signals插槽(即使它是从类派生的,其中Q_OBJECT
已经是),您应该将它添加到类中。关于这个主题已经有过讨论,所以它可以帮助您。类标题中是否有Q_OBJECT
宏?我在父类中有Q_OBJECT宏-我想子类会继承它。Q_OBJECT
宏应该在需要信号和插槽的每个类中使用。它不是一个属性,而是一个宏。这里有更多详细信息-@Shf谢谢,添加了Q_对象和一些小的更改就成功了。如果你把它作为一个答案,我会接受它是正确的。好的,发布的答案,很高兴,它帮助了你。你在类标题中有Q\u OBJECT
宏吗?我在父类中有Q\u OBJECT宏-我想子类会继承它。Q\u OBJECT
宏应该在你想要信号和插槽的每个类中使用。它不是一个属性,而是一个宏。这里有更多详细信息-@Shf谢谢,添加了Q_对象和一些小的更改就成功了。如果你把它作为一个答案,我会接受的是正确的答案。好的,张贴的答案,很高兴,它有帮助
class ErrorClass : public QObject{
Q_OBJECT
//...
void makeConnectHappen();
public slots:
virtual void exampleSlot();
}