QT解决方案中新建动态链接库工程,且继承于QObject,解决无法生成moc_XXX.cpp文件的问题,解决工程之间的引用问题
问题描述:
目的是利用QT和C++完成一套自动化设备的软件设计,在一个解决方案中有三个工程,分别是上位机(包括界面,MVC框架等)、运动部分工程、图像部分工程。如下图所示:
其中StemCells为上位机(包括界面,MVC框架等)工程、SCSModuleMotion为运动部分工程,SCSModuleVision为图像部分工程,而且StemCells为QT Application工程,SCSModuleMotion和SCSModuleVision为QT Library工程(生成动态链接库)。
问题来源于:因为SCSModuleMotion和SCSModuleVision需要与StemCells之前通过信号和槽来通信,所以这两个QT 动态链接库工程也需要继承于QObject类,并且需要有moc_XXXX.cpp文件,但是在新建了动态链接库时没有继承于QObject基类。
这样这两个工程就不能通过signal和slot方式与上位机工程通信,并且直接编译程序也不会有moc文件生成。
解决方法:
1.首先如上图手动加上OBject基类;
2.设置使可以生成moc文件:
(1)选中需要生成moc文件的对应的.h文件,右击→属性→常规→右侧最后一项(项类型)→选择自定义生成工具→点击右下角应用→左侧常规下面对出一项(自定义生成工具)。
(2)然后点开自定义生成工具,此时右侧全是空的,找一个可以生成moc文件的.h文件,同样操作,仿照那个文件在这里填上自定义生成工具。
(3)这时候,编译程序可以生成moc文件,并且保存在本地工程目录的Generated Files→Debug中,但是在VS界面该工程的Generated Files→Debug目录中没有该文件,这时需要邮寄Debug添加现有项将该文件加入。
3.这时候编译工程礽有错,虽然生成了moc文件,但是仍会报错,大致内容是“找不到QObject基类”
解决方法:因为新建后的工程没有继承于QObject基类,所以没有引用QObject的头文件(只在global.h文件中引用了#include <QtCore/qglobal.h>),
只需要再添加#include <QtCore/QObject>即可。
4. 此时编译的话可能还会报错,显示找不到QT执行程序的路径,这时候需要检查一下右击工程→属性→配置属性→调试→环境这里有没有把QT环境变量添加进来,如下图所示:
这些都设置完,dll工程编译应该就没有问题了。
5. 但是这时虽然编译工程没有错误了,但是当上位机工程引用该动态链接库工程时还会出错(各种无法引用的工程),这时候需要右击上位机工程→属性→通用属性→引用→将动态链接库工程添加至引用,如下图:
将上述所有步骤做完之后,工程编译便没有错误了,并且都可以与上位机工程进行信号和槽的通信。
另外在创建moc文件时,如果创建不正确需要重新创建或者moc文件又丢失了需要重新创建,这时只需要将对应的.h文件移除(不是删除)工程,然后再添加回来即可重新生成moc文件。