QT跨平台项目开发经验(项目打包)

1.代码编写
1.1 代码编写简短,代码运行效率高,适当注释。一般一个大型的项目,代码的运行效率要求较高,一般需要秒级响应,甚至毫秒级。
1.2 建议使用命名空间::的形式来访问该命名空间中的变量和函数,这样可以减少把该命名空间中所有的东西都导入到当前项目中,有利于节省系统资源。

std::string s;

1.3 C++ STL的使用
多使用STL中的数据结构和相关算法,一般这些数据结构和算法都能很好的满足需求,而且相关算法的效率也很高。

double  Max = DBL_MAX;//double中的最大值
std::map<std::string,std::vector<std::string>> Map;
std::vector<std::string>::size_type i=0;//vector中通过下标访问是,下标的类型
std::vector<std::string>::iterator it;//迭代器,通过迭代器来操作;

1.5 判断两个文件的内容是否完全相同,可以计算文件的MD5码,若MD5码相同,则文件的内容完全相同。这在处理很多具有重复的文件的时候,为文件的复用,可以根据MD5码来复用数据,可以提高文件处理的效率。

1.6 文件目录的遍历

//在windows中,主要通过 intptr_t 和 _finddata_t 结构和 函数_findfirst(),_findnext()和_findclose()来遍历文件和子文件夹下的文件。
#include<io.h>

intptr_t handle;
_finddata_t fileInfo;

handle = _findfirst((dir + "*"),&fileInfo);//查找目录dir下的文件或子目录,通过"*"来匹配文件或文件夹,可以通过"*.txt"来匹配dir下所有的.txt文件;
do
{
	if(fileInfo.attrib & _A_SUBDIR)//是一个文件目录
	{
		if (strcmp(fileInfo.name,".")==0 || strcmp(fileInfo.name,".."))//排除这两个目录
		{
			continue;
		}
		else
		{
			//找到子目录,做路径拼接
			std::string Path = dir + fileInfo.name + '\\';
			...
		}
	}
	else//是一个文件
	{
	
	}
}while(_findnext(handle,&fileInfo)==0);
_fincclose(handle);
//在Linux中主要通过结构struct stat 和struct dirent和函数lstat(),opendir()和 S_ISDIR()来遍历目录
#include<dirent.h>
#include<sys/stat.h>

struct stat s;
lstat(dir.c_str(),&s);
if(!S_ISDIR(s.st.mode))//不是一个目录
{
	return}
struct dirent* fileInfo;
DIR* openDir = opendir(dir.c_str())
if (openDir == NULL)//无法打开目录
{
	
}

while((fileInfo = readdir(openDir)!= NULL{
		if (strcmp(fileInfo->d_name,".")==0 || strcmp(fileInfo->d_name,".."))//排除这两个目录
		{
			continue;
		}
		else
		{
			struct stat child;
			lstat((dir+fileInfo->d_name).c_str(),&child);
			if(S_ISDIR(child.st_mode))//死一个文件夹
			{
				std::string Path = dir + fileInfo->d_name + '/';
				...
			}
			else//是一个文件
			{
				//可以根据文件名来判断文件的类型,选择出指定后缀名的文件;
			}
		}
}

2.代码管理
2.1 团队合作开发一个大型项目,为了方便项目的合并,调试运行等,需要对项目进行版本控制,可以通过svn来进行代码版本的管理;在windows中安装svn,可以方便的对代码提交过程中的冲突和代码的合并,以及代码的比较,找出版本之间的区别等,避免使用linux的命令的麻烦。

2.2 重服务器上更新下来的代码,在QT中需要先执行qmake,使别人修改的.pro的配置文件生效,在编译运行。

2.3 通过BCompare软件对两个版本的项目文件夹进行内容的比对,需要取消时间戳,不比较时间戳。可以方便代码的合并,对自己编写的比分践行合并,若存在多人编写的代码产生交叉的情况,需要商量之后在进行代码的合并。

2.4 代码的更新

在linux中,代码的跟新,进入到项目工程文件夹,通过svn up命令来更新;在windows中直接右键,可以更新或提交代码到服务器。

3.QT跨平台开发
3.1 在QT中进行项目开发,需要满足夸平台的需求时,需要我们在windows和linux下能正确运行代码,需要在windows和linux下进行代码的调试运行。

3.2 可以通过虚拟机来创建出一个linux系统,通过MobaXterm软件来实现windows和linux之间代码的互传;

3.3 编码问题
(1) 夸平台开发涉及到很多问题,最典型的就是系统的编码的统一,windows中使用的gbk编码,linux中使用的是utf-8编码。比如在涉及到文件的读写问题上,涉及到路径等问题时,就会出现问题。

(2) 在windows中.cpp文件采用的是gbk编码,在linux中,.cpp一般采用utf8编码,如果把windows中的路径直接复制(连编码格式都复制)到 linux .cpp文件中,那么路径就会出现乱码;

(3) 为了解决编码问题,需要为所有的函数参数和返回值使用统一编码,建议使用utf-8编码,std::string就是utf-8编码格式的,通过使用std::string来进行参数传递,若在某个函数中需要使用其他编码,则临时进行转换,结果在转换成utf8返回。总之,项目中数据的流动都采用统一的编码,否则,在后期项目开发过程中,出现编码问题,这修改起来变得很困难,因为一个参数可能出现多种编码混合在一起的情况,不管如何转码,都错误。

(4) 还需要明白我们调用不是自己开发的函数时,它接收的参数的编码是什么,windows中一般都是GBK编码,linux中是utf8编码的,因此在传入实参是,需要保证编码的正确。

3.4 QT跨平台开发,涉及到在不同的系统需要导入不同的库,或者使用不同系统的函数,则可以通过如下方式来实现。

#include <QtGlobal>//需要导入这个库,这里面定义了宏
#ifdef Q_OS_LINUX
    #include <dirent.h>
    #include <sys/stat.h>//linux系统的库
#elif defined Q_OS_WIN
    #include<io.h> //windows中的库
#endif


//函数
void fun()
{
#ifdef Q_OS_LINUX
	//编写LINUX代码
#elif defined Q_OS_WIN
 	//编写windows代码
#endif
    }

4.动态链接库的编写
4.1 在项目中涉及到很多动态链接库的时候,可创建一个总的动态链接库,把所有的其他的动态链接库放到它的下面作为它的子项目,这样在qmake和编译的时候,只需要对总的动态链接库做操作,而不需要对每个都做操作。

4.2 数据交互

  • 在进行数据交互的过程中,可以选择xml或者json格式来进行交互,采用开源的JSON和tinyxml库来进行数据的读写,可是很快的写出正确的数据格式。
  • xml数据格式与Json数据格式及其格式验证工具
    在进行数据交互的时候,我们需要对JSON或xml的格式进行验证,确保格式正确,可以采用线上验证工具来进行验证。

5.项目的打包发布
5.1 通过编辑器编译出一个Release版本的.exe文件,然后把.exe复制到一个空的文件夹,打开qt的命令行工具,注意选择对应的命令行工具,进入到.exe所在的目录,然后通过 windeployqt xxx.exe(加项目名称)命令即可在文件夹下生成.exe 运行依赖的文件,然后将整个文件夹打包即可在其他平台运行。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秘境之眼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值