Qt專案簡易開發原理及常見問題解決
一、資源下載地址
https://www.aliyundrive.com/s/jBU2wBS8poH
本專案路徑:專案->免費->QtDev
註釋:為了方便qt全功能開發,QtDev中包含了qt所有的Win32和x64的Release及Debug庫。如果開發簡單功能的話可以只下載對應所需要的庫即可。
二、專案介紹
1、從零開始開發一個小專案,通過本專案來介紹Qt介面簡易開發的過程及原理,簡易開發的意思是隻需要對應的Qt庫及編譯工具(如vs2019)即可。電腦不需要安裝Qt Creator,vs2019不需要安裝Qt外掛。本文使用vs2019來描述其原理,根據原理其他平臺下如Linux也可以進行簡易開發。
2、本專案完成的功能及解決的常見問題如下:
(1)、Qt生成的exe新增logo。
(2)、Qt載入資源來使用ico,png圖示。
(3)、Qt載入資源失敗的原因及解決方案,尤其是雙擊檔案使用exe開啟時資源載入失敗導致圖示無法顯示。
(4)、Qt中文亂碼的原因及解決方案。
(5)、軟體釋出的兩種形式:免安裝包和安裝包。
三、專案開始
1、準備工作
(1)、電腦安裝vs2019
(2)、Qt庫下載
最簡單的介面程式開發需要如下檔案:
2、vs2019新建一個空白解決方案
3、建立一個控制檯應用專案
4、建立一個基礎函式模組,封裝編碼轉換等一些基礎功能
原始碼:
新建工程:
在解決方案下新建一個
然後把原始碼拖到工程裡:
然後設定專案輸出目錄及專案設定為靜態庫:
然後設定附加包含目錄:
然後設定前處理器:
最後右擊生成該專案:
5、建立Qt介面模組
原始碼:
GuiQtDev.ui:
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>GuiQtDevClass</class> <widget class="QMainWindow" name="GuiQtDevClass"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>600</width> <height>400</height> </rect> </property> <property name="windowTitle"> <string>Gui</string> </property> <widget class="QWidget" name="centralWidget"/> <widget class="QMenuBar" name="menuBar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>600</width> <height>22</height> </rect> </property> </widget> <widget class="QToolBar" name="mainToolBar"> <attribute name="toolBarArea"> <enum>TopToolBarArea</enum> </attribute> <attribute name="toolBarBreak"> <bool>false</bool> </attribute> </widget> <widget class="QStatusBar" name="statusBar"/> </widget> <layoutdefault spacing="6" margin="11"/> <resources> <include location="GuiQtDev.qrc"/> </resources> <connections/> </ui>
GuiQtDev.qrc:
<RCC> <qresource prefix="/"> </qresource> </RCC>
GuiQtDev.h:
#pragma once #include <QtWidgets/QMainWindow> #include "ui_GuiQtDev.h" class GuiQtDev : public QMainWindow { Q_OBJECT public: GuiQtDev(QWidget *parent = Q_NULLPTR); private: Ui::GuiQtDevClass ui; };
GuiQtDev.cpp:
#include "GuiQtDev.h" GuiQtDev::GuiQtDev(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); }
新建工程:
在解決方案下新建一個modules資料夾,然後右擊modules新建空白專案:
然後把原始碼拖到工程裡:
然後設定專案輸出目錄及專案設定為靜態庫:
然後設定附加包含目錄:
然後設定前處理器:
接下來編輯資原始檔:
首先拷貝一個圖示檔案到原始碼檔案中:
然後在vs中右擊qrc檔案,選擇預設開啟方式為QrcEditor.exe:
然後雙擊qrc檔案進行新增圖示:
接下來右擊ui檔案,選擇預設開啟方式為designer.exe:
雙擊ui檔案進行編輯,比如拖拽一個按鈕,並且為按鈕顯示ico圖示(注意後續修改ui檔案時要手動重新生成該專案,因為vs無法知道ui檔案被修改):
這樣介面就設計好了。
接下來描述GuiQtDev模組編譯原理。
首先要使用uic.exe將GuiQtDev.ui轉換為ui_GuiGifView.h,然後使用moc.exe將GuiQtDev.h轉換為moc_GuiQtDev.cpp,然後使用rcc.exe將GuiQtDev.qrc轉換為GuiQtDev.rcc。右擊工程在生成前事件中進行自動轉換:
右擊工程點選生成,則自動生成這3個檔案:
然後將ui_GuiQtDev.h和moc_GuiQtDev.cpp拖拽到工程中:
然後在GuiQtDev.cpp中增加rcc資源註冊的程式碼:
然後生成該專案:
6、配置Main工程
首先設定Main工程依賴項:
然後刪去原有的Main.cpp,重新寫一個
main.cpp:
#if defined(WIN32) | defined(_WINDOWS) //不顯示控制檯 #pragma comment(linker,"/subsystem:windows /entry:mainCRTStartup") #pragma comment(lib, "Shell32.lib") #pragma comment(lib, "ole32.lib") #pragma comment(lib, "User32.lib") #pragma comment(lib, "ws2_32.lib") #pragma comment(lib, "Advapi32.lib") #pragma comment(lib, "Crypt32.lib") #pragma comment(lib, "legacy_stdio_definitions.lib") #pragma comment(lib, "Winmm.lib") #pragma comment(lib, "BaseFunc.lib") #pragma comment(lib, "GuiQtDev.lib") #ifndef _DEBUG #pragma comment(lib, "Qt5Core.lib") #pragma comment(lib, "Qt5Gui.lib") #pragma comment(lib, "Qt5Widgets.lib") #else #pragma comment(lib, "Qt5Cored.lib") #pragma comment(lib, "Qt5Guid.lib") #pragma comment(lib, "Qt5Widgetsd.lib") #endif #endif #include "GuiQtDev.h" int main(int argc, char* argv[]) { QApplication app(argc, argv); GuiQtDev v; v.show(); app.exec(); return 0; }
然後配置工程輸出目錄和中間目錄:
然後配置附加包含目錄:
Main前處理器設定:
然後配置附加庫目錄:
然後右擊生成:
最後如果要使程式能夠在vs中和在目錄裡雙擊exe來正確執行程式的話,還需要配置Main工程的生成後事件,拷貝動態庫和資原始檔到對應目錄:
然後執行exe,可以看到ico圖示顯示正常:
接下來為exe設定logo:
首先在Main工程目錄下放一個logo.ico,然後新建一個logo.rc,檔案內容如圖,並且在Main.vcxproj裡增加三行如圖:
然後重新生成exe後就看到有了logo:
接下來我們寫當雙擊某個檔案使用我們的exe開啟時,如何正確載入資原始檔及獲取當前選中的檔名:
先設計ui,拖放一個lineEdit控制元件來顯示檔名:
然後加一個介面來提供外部呼叫:
然後在main函式中獲取輸入的檔名(第二個引數)來設定到介面中,這裡需要注意的是vs預設使用的是gbk編碼,而Qt預設使用utf8編碼,所以要將字串轉換一下,否則中文會亂碼:
執行程式:
發現PushButton的ico不顯示了,解決方法:載入rcc檔案使用絕對路徑,並且要注意編碼問題:
先設定GuiQtDev專案為Unicode編碼:
然後修改資源載入程式碼:
重新執行後可以看到資源載入成功:
7、專案釋出
免安裝包:
就是這個資料夾:
安裝包:
使用setup factory來打包Release資料夾,並且可以設定程式是否自動啟動及新增桌面快捷方式等。