继承子类不能使用Q_OBJECT

时间:2013-12-17 12:56:59

标签: c++ qt qobject qtcore

我的课程有一个大问题:我将在我的子类中使用Q_OBJECT宏。但是如果我在子类中定义Q_OBJECT,它会抛出异常。这是例外:

undefined reference to `vtable for SubClassOne'
undefined reference to `vtable for SubClassTwo'

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

的main.cpp

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
SubClassTwo *s = new SubClassTwo();
s->show();
return a.exec();
}

如何在我的子类中使用Q_OBJECT

2 个答案:

答案 0 :(得分:3)

您的Q_OBJECT展示位置在您的代码中很好。

您要点击的是忘记在源中包含生成的moc文件,例如:

baseclass.cpp(在文件末尾)

#include "baseclass.moc"

subclassone.cpp(在文件末尾)

#include "subclassone.moc"

subclasstwo.cpp(在文件末尾)

#include "subclasstwo.moc"

您需要确保moc正在为您生成这些文件。你还没有展示你的构建系统。

另外,请确保每个“Q_OBJECT”类都有一个标头和源文件。这不是绝对必要的,但这是一个很好的做法。

您当然可以在链接时解决这个问题,但您需要执行其中任何一项。

此外,一旦你有多重继承,至少使用Qt 4,你需要先从QObject子类继承,在你的情况下是QWidget。您可以在下面找到正确的继承。

subclassone.h

class SubClassOne : public QWidget, public BaseClass

subclasstwo.h

class SubClassTwo : public QDialog, public BaseClass

等。希望它有所帮助。

答案 1 :(得分:0)

Q_OBJECT必须是您班级中的第一个声明,任何继承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以生成实现插槽和信号所需的代码