Ash*_*iya 4 c++ qt qt4 cmake forward-declaration
我正在尝试使用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
)
Run Code Online (Sandbox Code Playgroud)
当我按原样编译文件时,编译器给出如下错误 -
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之前'':\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-make 2:*[CMakeFiles/qtview.dir/src/moc_objectcontroller.cxx.obj]错误1 mingw32-make 1: [CMakeFiles/qtview.dir/all]错误2 mingw32-make:**[all]错误2
但当我评论出这条线时:
Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QVariant &))
Run Code Online (Sandbox Code Playgroud)
在"objectcontroller.h"中
并注释掉这条线:
#include "moc_objectcontroller.cxx"
Run Code Online (Sandbox Code Playgroud)
和文件"objectcontroller.cpp"的结尾,它编译得很好但我不能使用SIGNALS/SLOT来反映QObject参数的编辑.
有小费吗?
我遇到了同样的问题(我是qt的新手,但这对我有用).对于搜索解决方案的其他人,我发现了这个:
问题是由于Q_PRIVATE_SLOT宏生成moc_XXX.cxx需要类的完整声明XXXPrivate来调用私有槽函数.由于公共头只有前向声明它,生成的cxx不能自己编译.该QtPropertyBrowser人通过包括产生的规避这个问题moc_XXX.cpp(介意"PP",cmake的产生"XX"))在它们的源文件(丑,但工程).我也不知道任何其他方式告诉moc包括(在这种情况下甚至不存在)私有XXX_p.hpp.所以我们坚持这样.
我接下来要做的是moc_XXX.cxx从可执行文件中删除生成的文件,但这导致moc永远不会被调用.这发生了,即使我用过QT4_WRAP_CPP.经过进一步搜索,我发现......
这个特例的一个附录:QtProperty缺少声明.添加以下前向声明或相应的包含文件:
#if QT_VERSION >= 0x040400
QT_BEGIN_NAMESPACE
#endif
class QtProperty;
#if QT_VERSION >= 0x040400
QT_END_NAMESPACE
#endif
Run Code Online (Sandbox Code Playgroud)
完全归功于fullmetalcoder谁提出了这个cmake功能:
function(qt4_wrap_hdrs _moc_srcs)
qt4_get_moc_flags(_moc_incs)
set(_mocs)
foreach(_current_file ${ARGN})
get_filename_component(_abs_file ${_current_file} ABSOLUTE)
if(EXISTS ${_abs_file})
file(READ ${_abs_file} _contents)
get_filename_component(_basename ${_abs_file} NAME_WE)
string(REGEX MATCH "Q_OBJECT" _match "${_contents}")
if(_match)
set(_moc "${CMAKE_CURRENT_BINARY_DIR}/moc_${_basename}.cpp")
qt4_create_moc_command(${_abs_file} ${_moc} "${_moc_incs}" "")
macro_add_file_dependencies(${_abs_file} ${_moc})
list(APPEND _mocs ${_moc})
endif(_match)
endif(EXISTS ${_abs_file})
endforeach (_current_file)
set(${_moc_srcs} ${_mocs} PARENT_SCOPE)
endfunction(qt4_wrap_hdrs)
Run Code Online (Sandbox Code Playgroud)
(来自http://www.qtcentre.org/threads/37428-using-QT-unit-testing-with-CMake)
您可以使用此功能作为替代品QT4_WRAP_CPP.您现在只需要将以下行添加到CMakeLists.txt中,以便编译器找到生成的moc_XXX.cpp文件(新函数创建了'pp'文件...):
include_directories(${CMAKE_BINARY_DIR})
Run Code Online (Sandbox Code Playgroud)
此函数始终调用moc,其行为更像qmake情况.当然,除了您可以轻松完成源代码构建.
但有一点需要注意:所有moc_XXX.cpp文件都是在CMAKE_BINARY_DIR.所以,如果你有两个文件include1/foo.hpp,include2/foo.hpp一个将被覆盖!
| 归档时间: |
|
| 查看次数: |
2965 次 |
| 最近记录: |