c++ - 继承子类不能使用Q_OBJECT

标签 c++ qt qobject qtcore

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

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

最佳答案

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

子类.h

class SubClassOne : public QWidget, public BaseClass

subclasstwo.h

class SubClassTwo : public QDialog, public BaseClass

等等。希望对您有所帮助。

关于c++ - 继承子类不能使用Q_OBJECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20634802/

相关文章:

c++ - LNK1201 Visual C++ 2010 大型项目无法生成 PDB

c++ - 如何将系统图标放在菜单中?

qt - 当按钮大小改变时增加按钮字体大小

qt - 在Qt中,如何使用具有多重继承的Q_OBJECT插槽和信号?

c++ - 我什么时候应该使用 this->functionname() 而不是 classname::functionname() 来调用成员函数?

c++ - std::vector 随机添加元素到 vector

c++ - DLL 可以通过调用 EXE 加载资源吗?

c++ - 使用 qt 浏览、列出和删除文件

c++ - 在 Qt 中序列化我的自定义类

c++ - Qt/C++ 将 worker 的父级更改为 qthread 失败