2

我在编译项目时遇到了这个非常奇怪的问题。MOC 似乎正在向被 moc'ed 的类名添加命名空间,尽管文件/类中的任何地方都没有提到它。

然而,命名空间存在于我使用的库中,但它隐藏在头文件中很远的地方,我不在 UI 文件中使用它。这是 MOC 生成的:

const QMetaObject SmpTl::CaptureController::staticMetaObject = {
{ &QObject::staticMetaObject, qt_meta_stringdata_SmpTl__CaptureController,
  qt_meta_data_SmpTl__CaptureController, 0 }};

命名空间在的SmpTl声明中没有提到CaptureController,但它出现在 MOC 生成的 .cpp 文件中。

我正在使用带有 QT 集成的 Visual Studio。

4

2 回答 2

2

我也遇到了这个问题。我的代码如下所示:

namespace foo {
    #ifdef _WIN32
    ...   // This code was fine
    #else
    #error Not Supported
    #endif
}

这让 MOC 误以为命名空间foo永远不会关闭。显然,它不知道_WIN32已定义,并且因为我忘记在错误消息周围加上引号而被绊倒了。将其更改为:

#error "Not Supported"

解决了我的问题。

于 2012-03-07T20:58:44.280 回答
0

SmpTl是命名空间CaptureController的定义,因为它是由 MOC 找到的。

Q_OBJECT宏扩展为staticMetaObject类定义中的 -variable 的声明(以及它扩展的其他内容)。MOC 文件包含该变量的定义。

如果这不正确,请发布您的 Qt 版本和头文件的精简版本。

于 2010-04-21T19:56:57.917 回答