QT跨平台项目开发经验(项目打包)
1.代碼編寫
1.1 代碼編寫簡短,代碼運行效率高,適當注釋。一般一個大型的項目,代碼的運行效率要求較高,一般需要秒級響應,甚至毫秒級。
1.2 建議使用命名空間::的形式來訪問該命名空間中的變量和函數,這樣可以減少把該命名空間中所有的東西都導入到當前項目中,有利于節省系統資源。
1.3 C++ STL的使用
多使用STL中的數據結構和相關算法,一般這些數據結構和算法都能很好的滿足需求,而且相關算法的效率也很高。
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 運行依賴的文件,然后將整個文件夾打包即可在其他平臺運行。
總結
以上是生活随笔為你收集整理的QT跨平台项目开发经验(项目打包)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客21312 神秘餐馆
- 下一篇: 数据库基础知识——DML语言