非Qt基础类

49

我正在使用Visual Studio和Qt 4.8.2,创建了一个名为“Contact”的基类。 我不希望这个类局限于Qt,因此我的想法是创建另一个类“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基类?

谢谢。

2个回答

104
您可以从QObject派生您的类,以及从不派生自它的其他类派生,但在基类列表中,QObject必须是第一个基类

所以以下写法是错误的:

class QContact: public Contact, public QObject {};

你需要这样编写:

class QContact: public QObject, public Contact {};

这意味着该类在Qt项目之外没有用处。没有任何变通的方法吗? - MasterMastic
正如您所提到的:QObject 需要是第一个基类。另外,可以从这里获取更多信息:http://www.ffuts.org/blog/qt-staticmetaobject-is-not-a-member-of/ - MasterMastic
@Ken,我觉得你误解了我的意思和我链接中的内容。请看编辑部分。 - Johannes Schaub - litb
哦,是的,我误解了。非常感谢,很抱歉打扰了。 - MasterMastic
@Ken 一个小建议:给东西命名为 QSomething 会让它看起来像是 Qt API 的一部分。这有点误导人(如果我在我们的代码中看到 QContact,我会开始在文档中搜索它)。 - MrFox
显示剩余4条评论

-1

来自C++中设计模式的介绍与Qt第8.4章:

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

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

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接