簡體   English   中英

繼承子類不能使用Q_OBJECT

[英]Inheriting subclasses can not use Q_OBJECT

我的類存在一個大問題:我將在子類中使用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

您的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

等等。希望對您有所幫助。

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);
};

您還需要在標頭上運行moc以生成實現插槽和信號所需的代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM