最近QT-designer不知道为啥所有电脑上的qt-designer都崩溃,没办法只能调试源代码,于是在qt4.7.4的源代码tools下,打开designer.pro,将其加载为QT的VS项目,编译designer发现报好多问题,简单的问题我就不多说了,几个比较简单的问题有:
1.找不到lib_pch.h,找不到lib_pch.cpp,配置C/C++的include即可
2.找不到qdesigner_pch.h,解决方法上同
3.moc_iconselector_p.cpp文件编译的时候找不到 IconSelectorPrivate,也就是d_func()->slotStateActivated()等等都找不到声明
大家都知道C++编译的时候,肯定要找到类型的声明部分,但是要编译moc_iconselector_p.cpp那就要增加声明啊,但是大家想想
QT使用的都是Impl技术,也就是私有化内部实现,咱们是不可能加iconselector.cpp的,这样就没法编译了。(相互依赖啊)。
解决方案:
1.QT对特定的关键字处理不一样,对于头文件中Q_OBJECT的会采用moc机制来生成QMetaObject对象
2.对于Q_PRIVATE_SLOT() 其实并不是起到宏定义的作用,只是预留,留给moc来进行处理,对于Q_PRIVATE_SLOTS这种特殊的情况其生成的moc文件不能单独参与编译
(如果要编译,也就意味着需要include 私有类的定义)
3.正确的做法是如果遇到Q_PRIVATE_SLOT,需要在该实现文件(cpp文件中)最后加入moc_xxxx.cpp文件。由原始的cpp文件引导moc文件的编译,这样就形成单向编译了。
4.而qtdesigner中报的问题的根本原因是该moc文件参与编译了。所以要想根本的解决这个问题需要编辑vcprojx文件。将moc从编译中移除,移除方法如下:
找到该文件的编译选项:
<ClCompile Include="Debug\moc_iconselector_p.cpp">
<ExcludedFromBuild Condition="$(Configuration)|$(Platform)'=='Release|Win32'">true<ExcludedFromBuild>
<ClCompile>
很明显,右pro导入的vc项目文件配置有BUG,将部分文件的debug和release的移除依赖弄反了
<ClCompile Include="Debug\moc_iconselector_p.cpp">
<ExcludedFromBuild Condition="$(Configuration)|$(Platform)'=='Debug|Win32'">true<ExcludedFromBuild>
<ClCompile>
其他文件出现的这种问题也需要采用相同的方法来解决,如果debug编译不过去,就将有问题的文件从debug中移除,
release中有问题的文件从release中移除即可。【注意:每个文件针对每个配置选项都有一套,均需要修改正确】
5.在此编译QTDesigner成功通过
6.designer也OK了,嘿嘿
7.另外通过调试 我也知道了为什么我的qtdesigner一直崩溃的问题了,不止第三方DLL的问题,而是有个设计的配置文件有问题,文件位置在
c:\users\用户名\.designer 【注意designer前面的点号,默认是隐藏的】里面有个gradients.xml,我发现这个文件有700多M。由于这个文件
加载错误导致了qtdesigner的崩溃,将该文件删除即可,QT的资源里有默认的配置文件。