我正在尝试将一个类中的按钮发送的信号与子类和父类的插槽连接起来。这是一个重现问题的例子:
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
?或者我的想法是完全错误的?
答案 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()
信号时,它将触发正确的插槽,具体取决于您使用此按钮实例化的对象的类。