47

我在 Visual Studio 中使用 Qt(我是新手)4.8.2,并且我创建了一个名为“Contact”的基类。我不希望这个类是 Qt-exclusive,所以我的意图是创建另一个类“QContact”,它将继承“Contact”和 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 类。所以要修复它,“Contact”可以继承“QObject”(我试过了,它有效)。但这样做会使其专属于 Qt,这是我的问题。

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

谢谢你。

4

2 回答 2

100

您可以QObject从其他非派生类派生您的类,但QObject必须是基类列表中的第一个基类。

所以这是错误的:

class QContact: public Contact, public QObject {};

你需要把它写成

class QContact: public QObject, public Contact {};
于 2012-08-04T09:37:29.653 回答
-1

An Introduction To Design Patterns in C++ with Qt Chapter 8.4:

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

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

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

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

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

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

于 2018-01-15T23:30:59.210 回答