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

  显示原文与译文双语对照的内容
0 0

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


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

我的SubClassOneSubClassTwoBaseClass 继承。

这里有一些代码:( 所有 #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

时间: 原作者:

0 0

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

你所碰到的是,你忘记了在源中包含生成的rtc文件,如:

baseclass.cpp ( 在文件末尾)


#include"baseclass.moc"

subclassone.cpp ( 在文件末尾)


#include"subclassone.moc"

subclasstwo.cpp ( 在文件末尾)


#include"subclasstwo.moc"

你需要确保moc为你生成这些文件,尽管。 你还没有显示你的buildsystem 。

另外,请确保每个"q_object"类有一个头文件和源文件。 这不是必要的,但它是一个好的实践。

当然,你也可以解决链接时间,但是你需要执行以下任一操作。

而且,一旦有多重继承,至少在 Qt 4中,你需要首先从 QObject 子类继承,这是你的例子中的QWidget 。 你可以在下面找到正确的继承。

subclassone.h


class SubClassOne : public QWidget, public BaseClass

subclasstwo.h


class SubClassTwo : public QDialog, public BaseClass

希望它能帮助你。

原作者:
0 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,以生成实现插槽和信号所需的代码

...