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 运行依赖的文件,然后将整个文件夹打包即可在其他平台运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高等数学、线性代数、概率论、几何这些知识可以用来干什么?

来源&#xff1a;图灵人工智能应该会有很多模友在开始学习数学分析和高等数学时&#xff0c;第一反应是&#xff1a;但其实大多数人所用的教材&#xff0c;从大众角度看还没有到一种极致精确的架构数学的程度。大多数的教材所做的还是“我教会你怎么弄这个东西就行了&#xff0…

CentOS7 /etc/profile 添加环境变量重开终端后不生效

排查步骤如下&#xff1a; 查看/etc/profile里面的环境变量是否填写正确。 需要重启操作系统&#xff08;很重要&#xff01;&#xff01;&#xff01;&#xff09; 将环境变量写入/etc/bashrc文件

C++类重点难点

1.构造函数与析构函数 1.1 在创建对象的时候会执行构造函数&#xff0c;对对象的成员属性进行初始话&#xff0c;在对象的生命周期结束时&#xff0c;执行析构函数&#xff1b; 1.2 设计到动态分配内存的时候&#xff0c;在构造函数中进行内存分配&#xff0c;在析构函数中进行…

CentOS7.7安装MySQL5.6并配置环境变量(详细版)

i. tar包下载 官网下载 https://dev.mysql.com/downloads/mysql/网盘获取 链接&#xff1a;https://pan.baidu.com/s/1DpULc0qQ4hqx6HWUwRilpw 提取码&#xff1a;tgdv ii. 安装所需环境 yum -y install make gcc-c cmake bison-devel ncurses-develiii. 解压tar包&#xf…

多少血的教训,才能换来对自动驾驶的严格限定、真实了解和正确使用?

来源&#xff1a;胡延平EarthRambler真的到了应该出台严格的安全措施的时候&#xff0c;而&#xff1c;道路交通安全法*修订建议稿&#xff1e;如何明确责任成为关从最新一起车祸的碰撞情况看&#xff0c;高速公路追尾卡车&#xff0c;雷达对前方目标的识别和驾驶系统的反应可能…

java并发编程-----深入剖析ThreadLocal

一.对ThreadLocal的理解 ThreadLocal&#xff0c;很多地方叫做线程本地变量&#xff0c;也有些地方叫做线程本地存储&#xff0c;其实意思差不多。可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本&#xff0c;那么每个线程可以访问自己内部的副本变量。 这句…

QT动态连接库的编写

1.QT动态链接库的编写流程 1.1 首先在Qt Creator中创建一个动态连接库Matrix&#xff0c;添加类名&#xff0c;生成一个类(matrix.h和matrix.cpp)和一个matrix_global.h的文件&#xff0c;在matrix_global.h中可看到使用的导出宏&#xff0c;为MATRIXSHARED_EXPORT。如果只想导…

VMware下主机与虚拟机剪切板独立,无法直接复制粘贴

看了很多博客都说需要重新安装vmware tools&#xff0c;但我使用的是这种方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 关闭虚拟机点击编辑虚拟机设置->选项选择客户机隔离&#xff0c;勾选上启动复制粘贴即可&#xff08;如果之前就已经勾选上但失效的情…

教AI区分因果关系和相关性,将改变下一代 AI 的研发

来源&#xff1a;ScienceAI编辑&#xff1a;萝卜皮多年前&#xff0c;AI 领域曾发生过一件荒唐而有趣的事情。据说&#xff0c;研究人员开发了一种对医院数据进行训练的算法。这个算法发现&#xff0c;「患有哮喘的肺炎患者的治愈表现&#xff0c;比没有哮喘的肺炎患者更好」&a…

sdaf

dfddfdd 转载于:https://www.cnblogs.com/jiangfeilong/p/10432174.html

Java Socket实现客户端服务端之间的通信

Java Socket Java Socket编程用于在不同JRE上运行的应用程序之间的通信。Java Socket编程可以是面向连接的或无连接的。Socket和ServerSocket类用于面向连接的套接字编程&#xff0c;DatagramSocket和DatagramPacket类用于无连接套接字编程。 此Demo将进行单向客户端和服务器…

数据结构-线性结构

一.线性结构 1.顺序线性表 1.1 线性结构是一种基本的数据结构&#xff0c;具有单一前驱和后继的数据关系描述。 1.2 线性表的存储结构分为顺序存储和链式存储。 1.3 顺序线性表的元素间的逻辑关系无需占用额外的空间来存储。 1.4 一般地&#xff0c;以LOC(a1a_1a1​)表示线性…

脑智前沿科普|虚拟现实如何欺骗你的大脑

来源&#xff1a;公众号&#xff08;脑与心智毕生发展研究中心CLIMB&#xff09;编辑&#xff1a;Yezi审阅&#xff1a;mingzlee7虚拟现实(Virtual reality, VR)就像被神奇地传送到另一个世界。这是一项令人兴奋的技术&#xff0c;但当我们戴上耳机后&#xff0c;我们很少停下来…

C++11新特性以及std::thread多线程编程

一 .C11新特性 1. auto 类型推导 1.1 当号右边的表达式是一个引用类型时&#xff0c;auto会把引用抛弃&#xff0c;直接推导出原始类型&#xff1b; 1.2 当号右边的表达式带有const属性时&#xff0c;auto不会使用const属性&#xff1b; 1.3 当const 和引用结合时&#xff0c;…

Linux下Java连接数据库出现 Access denied for user 'root'@'localhost' (using password: YES)错误

一、问题描述 centos 7 终端键入 mysql -u root -p 输入密码后可成功访问数据库&#xff0c;但使用IDEA编写Java代码实现数据库连接时却出现Access denied for user ‘root’‘localhost’ (using password: YES) 错误。 二、解决方法 在刚安装mysql时&#xff0c;系统会默认…

Zookeeper常用命令行及API

一、Zookeeper常用命令行 1.启动zookeeper客户端(在启动zookeeper集群后启动进行调试) zkCli.sh   2.查看帮助、操作历史 help、history 3.查看当前Znode的目录 ls /    ls2 /  (查看当前Znode的详细信息) 4.创建Znode (1)默认&#xff1a;create 路径 内容 create /Wy…

被骗两次?黄仁勋骗过世界的14秒,英伟达押宝未来的元宇宙……

来源&#xff1a;物联网智库在近期召开的计算机图形顶级会议ACM SIGGRAPH 2021 上&#xff0c;英伟达介绍了自研的3D仿真模拟和协作平台Omniverse&#xff0c;并放出了“合成版老黄”的打造过程。有媒体据此报道称——万万没想到&#xff0c;在3个月前的GTC大会中&#xff0c;厨…

QT清单打印程序

1.主要代码 //customer.h文件 #ifndef CUSTOMER_H #define CUSTOMER_H#include <QObject> #include <string>class Customer : public QObject {Q_OBJECT public:explicit Customer(QObject *parent nullptr);Customer(const Customer& customer);void setCo…

Linux下生成指定大小文件(命令+Java程序)

1、dd命令 of&#xff1a;fileName为文件名称&#xff0c;例如test.txt &#xff1b; bs&#xff1a;设置一次复制的大小&#xff0c;例如1M&#xff1b; count&#xff1a;设置复制次数&#xff0c;例如100&#xff1b; dd if/dev/zero of<fileName> bs<一次复制…

C语言之随机数函数( rand() )的使用方法

文章出自个人博客https://knightyun.github.io/2018/04/25/c-rand-number&#xff0c;转载请申明。 在程序设计中&#xff0c;难免会使用到随机值函数&#xff0c;其原理与语法大多类似&#xff0c;接下来以C语言为例介绍其随机值函数 rand() 用法。 原理 引用百度百科&#xf…