[英]Inheriting subclasses can not use Q_OBJECT
I have a big problem with my classes: I will use the Q_OBJECT
macro in my subclasses. 我的类存在一个大问题:我将在子类中使用
Q_OBJECT
宏。 But if I define Q_OBJECT
in my subclasses, it throws an exception. 但是,如果我在子类中定义
Q_OBJECT
,它将引发异常。 This is the exception: 这是例外:
undefined reference to `vtable for SubClassOne'
undefined reference to `vtable for SubClassTwo'
My SubClassOne
and SubClassTwo
inherits from BaseClass
. 我的
SubClassOne
和SubClassTwo
继承自BaseClass
。
Here some Code: (All #include
s are correct) 这里是一些代码:(所有
#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);
};
Here comes the .cpp Files 这是.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();
}
How can I use Q_OBJECT
in my subclasses? 如何在子类中使用
Q_OBJECT
?
Your Q_OBJECT placement is fine in your code. 您的Q_OBJECT位置在代码中很好。
What you are hitting is that you forgot to include the generated moc file in your source such as: 您遇到的是您忘记在源中包含生成的moc文件,例如:
#include "baseclass.moc"
#include "subclassone.moc"
#include "subclasstwo.moc"
You need to make sure moc is generating these files for you though. 但是,您需要确保moc正在为您生成这些文件。 You have not shown your buildsystem yet.
您尚未显示构建系统。
Also, please make sure to have one header and source file per "Q_OBJECT" classes. 另外,请确保每个“ Q_OBJECT”类具有一个头文件和源文件。 It is not strictly necessary, but it is a good practice.
并非绝对必要,但这是一个好习惯。
You can of course resolve that at link time as well, but you will need to do either of those. 您当然也可以在链接时解决该问题,但是您将需要执行其中任一操作。
Moreover, once you have multiple inheritance, at least with Qt 4, you will need to inherit from the QObject
subclass first, which is QWidget
in your case. 此外,一旦您具有多重继承,至少使用Qt 4,您将需要首先从
QObject
子类继承,在您的情况下为QWidget
。 You can find the correct inheritance below. 您可以在下面找到正确的继承。
class SubClassOne : public QWidget, public BaseClass
class SubClassTwo : public QDialog, public BaseClass
etc. Hope it helps. 等等。希望对您有所帮助。
Q_OBJECT
must be the firs declaration in your class and any class inheriting QObject must be first in the list 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);
};
you also need to run the moc on the header to generate the code needed to implement the slots and signals 您还需要在标头上运行moc以生成实现插槽和信号所需的代码
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.