简体   繁体   English

继承子类不能使用Q_OBJECT

[英]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 . 我的SubClassOneSubClassTwo继承自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);
}

main.cpp main.cpp中

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文件,例如:

baseclass.cpp (at the end of the file) baseclass.cpp(在文件末尾)

#include "baseclass.moc"

subclassone.cpp (at the end of the file) subclassone.cpp(在文件末尾)

#include "subclassone.moc"

subclasstwo.cpp (at the end of the file) subclasstwo.cpp(在文件末尾)

#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. 您可以在下面找到正确的继承。

subclassone.h subclassone.h

class SubClassOne : public QWidget, public BaseClass

subclasstwo.h subclasstwo.h

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM