我正在尝试使用QTPropertyBrowser来编辑QObjects中的属性 . 从QT Solutions“QtPropertyBrowser”示例中,我在项目中使用以下文件 .
我配置我的CMakeFile如下:
#include_directories("/usr/include")
SET(QTVIEW_SRCS
src/main.cpp
src/TestWidget.cpp
src/plugin/IPlugin.cpp
src/objectcontroller.cpp
)
SET(QTVIEW_MOH_HDRS
src/TestWidget.h
src/plugin/IPlugin.h
src/objectcontroller.h
)
当我按原样编译文件时,编译器给出如下错误 -
C:\ svn \ osaka3d \ trunk \ osaka3d \ QTView \ src \ moc_objectcontroller.cxx:在成员函数'virtual int ObjectController :: qt_metacall(QMetaObject :: Call,int,void )':C:\ svn \ osaka3d \ trunk \ osaka3d \ QTView \ src \ moc_objectcontroller.cxx:73:错误:无效使用不完整类型'struct ObjectControllerPrivate'C:\ svn \ osaka3d \ trunk \ osaka3d \ QTView \ src / objectcontroller.h:45:错误:转发声明'struct ObjectControllerPrivate'C:\ svn \ osaka3d \ trunk \ osaka3d \ QTView \ src \ moc_objectcontroller.cxx:73:错误:'QtProperty'之前的预期类型说明符C:\ svn \ osaka3d \ trunk \ osaka3d \ QTView \ src \ moc_objectcontroller.cxx:73:错误:在'QtProperty'之前预期'>'C:\ svn \ osaka3d \ trunk \ osaka3d \ QTView \ src \ moc_objectcontroller.cxx:73:错误:预期'('在'QtProperty'C之前' :\ svn \ osaka3d \ trunk \ osaka3d \ QTView \ src \ moc_objectcontroller.cxx:73:错误:'QtProperty'未在此范围内声明C:\ svn \ osaka3d \ trunk \ osaka3d \ QTView \ src \ moc_objectcontroller.cxx: 73:错误:之前预期的primary-expression ')'token mingw32-make2: [CMakeFiles / qtview.dir / src / moc_objectcontroller.cxx.obj]错误1 mingw32-make1:[CMakeFiles / qtview.dir / all]错误2 mingw32-make:* [全部]错误2
But when I comment out the line :
Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QVariant &))
在“objectcontroller.h”中
and comment out the line :
#include "moc_objectcontroller.cxx"
和文件“objectcontroller.cpp”的结尾,它编译得很好但是我不能使用SIGNALS / SLOT来反映QObject参数的编辑 .
有小费吗?
2 回答
我遇到了同样的问题(我是qt的新手,但这对我有用) . 对于搜索解决方案的其他人,我发现了这个:
发生了什么事
问题是由于
Q_PRIVATE_SLOT
宏,生成的moc_XXX.cxx
需要XXXPrivate
类的完整声明来调用私有槽函数 . 由于公共头只有前向声明它,生成的cxx不能自己编译 . QtPropertyBrowser的家伙通过在他们的源文件中包含生成的moc_XXX.cpp
(介意'pp',cmake生成'xx'))来规避这个问题(丑陋,但有效) . 我也不知道任何其他方式告诉moc包括(在这种情况下甚至不存在)privateXXX_p.hpp
. 所以我们坚持这样 .我接下来要做的是从可执行文件中删除生成的
moc_XXX.cxx
文件,但这导致moc永远不会被调用 . 即使我使用QT4_WRAP_CPP
,也会发生这种情况 . 经过进一步搜索,我发现......这个特例的一个附录:缺少
QtProperty
声明 . 添加以下前向声明或相应的包含文件:解决方案
完全归功于fullmetalcoder谁提出了这个cmake功能:
(来自http://www.qtcentre.org/threads/37428-using-QT-unit-testing-with-CMake)
您可以将此功能用作
QT4_WRAP_CPP
的替代品 . 您现在只需要将以下行添加到CMakeLists.txt中,以便编译器找到生成的moc_XXX.cpp
文件(新函数创建了'pp'文件...):此函数始终调用moc,其行为更像qmake情况 . 当然,除了您可以轻松完成源代码构建 .
但有一点需要注意:所有
moc_XXX.cpp
文件都是在CMAKE_BINARY_DIR
中生成的 . 所以如果你有两个文件include1/foo.hpp
和include2/foo.hpp
将被覆盖!您是否阅读了以下关于一起使用Qt和CMake的文章?
http://developer.qt.nokia.com/quarterly/view/using_cmake_to_build_qt_projects
也许你忘记了一些事情,比如在你的CMakeLists.txt上调用
QT4_WRAP_CPP
.