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

时间:2013-08-02 14:09:03

标签: c++ qt

我正在尝试将一个类中的按钮发送的信号与子类和父类的插​​槽连接起来。这是一个重现问题的例子:

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";
}

ErrorClassChild.cpp

#include "errorclasschild.h"

ErrorClassChild::ErrorClassChild(QPushButton *button) : ErrorClass(button)
{
    makeConnectHappen();
}
void ErrorClassChild::makeConnectHappen()
{
    ErrorClass::makeConnectHappen();
    connect(button, SIGNAL(released()), this, SLOT(exampleChildSlot()));
}
//SLOT
void ErrorClassChild::exampleChildSlot()
{
    qDebug() << "exampleChildSlot was here";
}

最后是带有QPushButton的标准MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "errorclasschild.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ErrorClassChild ecc(ui->pushButton);
}
MainWindow::~MainWindow()
{
    delete ui;
}

其中makeConnectHappen()是ErrorClass.h中的一个虚函数,它由ErrorClassChild继承和扩展。我希望这一点很清楚。

当我编译并运行程序时,有Apllication Message

QObject::connect: No such slot ErrorClass::exampleChildSlot() in ../QListWidgetProblem/errorclasschild.cpp:11
QObject::connect:  (sender name:   'pushButton')

现在,当我将exampleChildSlot()作为纯虚拟插槽放在父级中时,错误消失但不会显示qDebug()消息。

如何同时与父母和子女一起制作connect?或者我的想法是完全错误的?

2 个答案:

答案 0 :(得分:2)

Q_OBJECT不是属性,它是一个宏,所以它不能被继承。因此,如果您想在类中使用信号槽(即使它是从类中派生出来的,Q_OBJECT已经存在),您应该将它添加到您的类中。已经讨论过这个主题here,所以它可以帮到你。

答案 1 :(得分:1)

您应该使用虚拟广告位(Qt doc explicitely say they can be virtual):

将这些声明放在基类

class ErrorClass : public QObject{

    Q_OBJECT
//...   
    void makeConnectHappen();    

public slots:
    virtual void exampleSlot();

}

然后,完全按照您的方式为基类实现makeConnectHappen(),并且您只需重新实现派生类中的插槽。然后,当按钮发出pressed()信号时,它将触发正确的插槽,具体取决于您使用此按钮实例化的对象的类。