0

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

错误类.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;
}

ErrorClass.hmakeConnectHappen()中的虚函数是由 ErrorClassChild 继承和扩展的。我希望这会很清楚。

当我编译并运行程序时,有应用消息

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

现在,当我将exampleChildSlot() 父级作为纯虚拟插槽放入时,错误消失了,但没有qDebug()显示任何消息。

如何同时制作connect与父母和孩子的插槽?还是我的想法完全错误?

4

2 回答 2

2

Q_OBJECT不是属性,它是一个宏,所以它不能被继承。所以如果你想在你的类中使用信号槽(即使它是从Q_OBJECT已经存在的类派生的),你应该将它添加到你的类中。这里已经有关于这个话题的讨论,所以它可以帮助你。

于 2013-08-03T21:19:27.453 回答
1

您应该使用虚拟插槽(Qt 文档明确表示它们可以是虚拟的):

将这些声明放在您的基类中

class ErrorClass : public QObject{

    Q_OBJECT
//...   
    void makeConnectHappen();    

public slots:
    virtual void exampleSlot();

}

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

于 2013-08-02T14:21:36.760 回答