C++ 如何在子类和父类之间添加插槽?

C++ 如何在子类和父类之间添加插槽?,c++,qt,C++,Qt,我试图将一个类中的按钮发送的信号与子类和父类的插槽连接起来。下面是一个重现问题的示例: ErrorClass.cpp #include "errorclass.h" ErrorClass::ErrorClass(QPushButton *button) : QObject() { this->button = button; } void ErrorClass::makeConnectHappen() { connect(button, SIGNAL(pressed())

我试图将一个类中的按钮发送的信号与子类和父类的插槽连接起来。下面是一个重现问题的示例:

ErrorClass.cpp

#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();

}