首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承子类不能使用Q_OBJECT

继承子类不能使用Q_OBJECT
EN

Stack Overflow用户
提问于 2013-12-17 12:56:58
回答 2查看 3K关注 0票数 2

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

代码语言:javascript
复制
undefined reference to `vtable for SubClassOne'
undefined reference to `vtable for SubClassTwo'

我的SubClassOneSubClassTwo继承自BaseClass

这里有一些代码:(所有的#includes都是正确的)

代码语言:javascript
复制
\\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文件来了

代码语言:javascript
复制
//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

代码语言:javascript
复制
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
SubClassTwo *s = new SubClassTwo();
s->show();
return a.exec();
}

如何在子类中使用Q_OBJECT

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-17 13:02:23

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

您所碰到的是,您忘记在源中包含生成的moc文件,如:

baseclass.cpp (文件末尾)

代码语言:javascript
复制
#include "baseclass.moc"

subclassone.cpp (文件末尾)

代码语言:javascript
复制
#include "subclassone.moc"

subclasstwo.cpp (文件末尾)

代码语言:javascript
复制
#include "subclasstwo.moc"

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

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

当然,您也可以在链接时解决这些问题,但是您需要做到这两种方法中的一种。

此外,一旦您拥有了多个继承(至少使用了Qt 4 ),您将需要首先从QObject子类继承,这在您的情况下是QWidget。您可以在下面找到正确的继承。

subclassone.h

代码语言:javascript
复制
class SubClassOne : public QWidget, public BaseClass

subclasstwo.h

代码语言:javascript
复制
class SubClassTwo : public QDialog, public BaseClass

等等,希望能帮上忙。

票数 3
EN

Stack Overflow用户

发布于 2013-12-17 13:02:27

Q_OBJECT必须是类中的firs声明,继承QObject的任何类必须位于列表的第一位。

代码语言:javascript
复制
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以生成实现插槽和信号所需的代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20634802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档