[英]Inheriting subclasses can not use Q_OBJECT
我的类存在一个大问题:我将在子类中使用Q_OBJECT
宏。 但是,如果我在子类中定义Q_OBJECT
,它将引发异常。 这是例外:
undefined reference to `vtable for SubClassOne'
undefined reference to `vtable for SubClassTwo'
我的SubClassOne
和SubClassTwo
继承自BaseClass
。
这里是一些代码:(所有#include
都是正确的)
\\baseclass.h
class BaseClass
{
public:
BaseClass(QWidget *widget=0);
QHBoxLayout *mainLayout;
};
\\subclassone.h
class SubClassOne : public BaseClass, public QWidget
{
Q_OBJECT
public:
explicit SubClassOne(QWidget *widget=0);
};
\\subclasstwo.h
class SubClassTwo : public BaseClass, public QDialog
{
Q_OBJECT
public:
explicit SubClassTwo(QWidget *dialog=0);
};
这是.cpp文件
//baseclass.cpp
BaseClass::BaseClass(QWidget *widget)
{
mainLayout = new QHBoxLayout();
}
//subclassone.cpp
SubClassOne::SubClassOne(QWidget *widget):BaseClass(widget)
{
setWindowTitle("Widget");
}
//subclasstwo.cpp
SubClassTwo::SubClassTwo(QWidget *dialog):BaseClass(dialog)
{
setWindowTitle("Dialog");
QPushButton *btn = new QPushButton();
QObject::connect(btn,SIGNAL(clicked()),SLOT(close()));
mainLayout->addWidget(btn);
setLayout(mainLayout);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
SubClassTwo *s = new SubClassTwo();
s->show();
return a.exec();
}
如何在子类中使用Q_OBJECT
?
您的Q_OBJECT位置在代码中很好。
您遇到的是您忘记在源中包含生成的moc文件,例如:
#include "baseclass.moc"
#include "subclassone.moc"
#include "subclasstwo.moc"
但是,您需要确保moc正在为您生成这些文件。 您尚未显示构建系统。
另外,请确保每个“ Q_OBJECT”类具有一个头文件和源文件。 并非绝对必要,但这是一个好习惯。
您当然也可以在链接时解决该问题,但是您将需要执行其中任一操作。
此外,一旦您具有多重继承,至少使用Qt 4,您将需要首先从QObject
子类继承,在您的情况下为QWidget
。 您可以在下面找到正确的继承。
class SubClassOne : public QWidget, public BaseClass
class SubClassTwo : public QDialog, public BaseClass
等等。希望对您有所帮助。
Q_OBJECT
必须是您的类中的firs声明,并且任何继承QObject的类都必须在列表中排在首位
class SubClassOne : public QWidget, public BaseClass
{
Q_OBJECT
public:
explicit SubClassOne(QWidget *widget=0);
};
\\subclasstwo.h
class SubClassTwo : public QDialog, public BaseClass
{
Q_OBJECT
public:
explicit SubClassTwo(QWidget *dialog=0);
};
您还需要在标头上运行moc以生成实现插槽和信号所需的代码
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.