非Qt基类

时间:2012-08-04 09:34:01

标签: c++ oop qt

我正在使用Qt(我是新手)4.8.2,使用Visual Studio,我创建了一个名为“Contact”的基类。 我不希望这个类是Qt独占的,所以我的目的是创建另一个继承“Contact”的类“QContact”,以及QObject并处理所有与Qt相关的业务,例如Q_OBJECT宏等。

不幸的是,当我继承时,构建失败了,说:

moc_QContact.cpp(53): error C2039: 'staticMetaObject' : is not a member of 'Contact'
moc_QContact.cpp(75): error C2039: 'qt_metacast' : is not a member of 'Contact'
moc_QContact.cpp(80): error C2039: 'qt_metacall' : is not a member of 'Contact'

我在网上做了一些研究,发现你无法从非Qt类派生出一个Qt类。所以要解决它,“联系”可以继承“QObject”(我试过,它有效)。但这样做会让Qt专属于我的问题。

所以我问的是:你如何为Qt类创建一个非Qt基类?

谢谢。

2 个答案:

答案 0 :(得分:81)

您可以从QObject以及从其中派生的其他类派生您的类,但在基类列表中派生QObject needs to be the first base class

所以这是错误的:

class QContact: public Contact, public QObject {};

你需要把它写成

class QContact: public QObject, public Contact {};

答案 1 :(得分:0)

来自An Introduction To Design Patters in C++和Qt第8.4章:

帮助确保moc进程 项目中的每个QObject派生类,以下是一些编写指南: C ++代码和qmake项目文件:

•每个类定义都应该放在自己的.h文件中。

•它的实现应该放在相应的.cpp文件中。

•头文件应该“包装”(例如,使用#ifndef)以避免多次包含。 •每个.cpp文件都应列在项目文件的SOURCES变量中; 否则不会被编译。

•每个头文件都应列在.pro文件的HEADERS变量中。 如果没有这个,moc将不会预处理文件。

•Q_OBJECT宏必须出现在每个QObject的类定义中 派生头文件,以便moc知道为它生成代码。