1. 程式人生 > 其它 >Qt專案簡易開發原理及常見問題解決

Qt專案簡易開發原理及常見問題解決

(1)、Qt生成的exe新增logo。 (2)、Qt載入資源來使用ico,png圖示。 (3)、Qt載入資源失敗的原因及解決方案,尤其是雙擊檔案使用exe開啟時資源載入失敗導致圖示無法顯示。 (4)、Qt中文亂碼的原因及解決方案。 (5)、軟體釋出的兩種形式:免安裝包和安裝包。

一、資源下載地址

https://www.aliyundrive.com/s/jBU2wBS8poH

本專案路徑:專案->免費->QtDev

註釋:為了方便qt全功能開發,QtDev中包含了qt所有的Win32x64ReleaseDebug庫。如果開發簡單功能的話可以只下載對應所需要的庫即可。

二、專案介紹

1、從零開始開發一個小專案,通過本專案來介紹Qt介面簡易開發的過程及原理,簡易開發的意思是隻需要對應的Qt庫及編譯工具(如vs2019)即可。電腦不需要安裝Qt Creatorvs2019不需要安裝Qt外掛。本文使用vs2019來描述其原理,根據原理其他平臺下如Linux也可以進行簡易開發。

2、本專案完成的功能及解決的常見問題如下:

(1)Qt生成的exe新增logo

(2)Qt載入資源來使用icopng圖示。

(3)Qt載入資源失敗的原因及解決方案,尤其是雙擊檔案使用exe開啟時資源載入失敗導致圖示無法顯示。

(4)Qt中文亂碼的原因及解決方案。

(5)、軟體釋出的兩種形式:免安裝包和安裝包。

三、專案開始

1、準備工作

(1)、電腦安裝vs2019

(2)Qt庫下載

最簡單的介面程式開發需要如下檔案:

2vs2019新建一個空白解決方案

3、建立一個控制檯應用專案

4、建立一個基礎函式模組,封裝編碼轉換等一些基礎功能

原始碼:

新建工程:

在解決方案下新建一個

core資料夾,然後右擊core新建空白專案:

然後把原始碼拖到工程裡:

然後設定專案輸出目錄及專案設定為靜態庫:

然後設定附加包含目錄:

然後設定前處理器:

最後右擊生成該專案:

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.exeGuiQtDev.ui轉換為ui_GuiGifView.h,然後使用moc.exeGuiQtDev.h轉換為moc_GuiQtDev.cpp,然後使用rcc.exeGuiQtDev.qrc轉換為GuiQtDev.rcc。右擊工程在生成前事件中進行自動轉換:

右擊工程點選生成,則自動生成這3個檔案:

然後將ui_GuiQtDev.hmoc_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編碼,所以要將字串轉換一下,否則中文會亂碼:

執行程式:

發現PushButtonico不顯示了,解決方法:載入rcc檔案使用絕對路徑,並且要注意編碼問題:

先設定GuiQtDev專案為Unicode編碼:

然後修改資源載入程式碼:

重新執行後可以看到資源載入成功:

7、專案釋出

免安裝包:

就是這個資料夾:

安裝包:

使用setup factory來打包Release資料夾,並且可以設定程式是否自動啟動及新增桌面快捷方式等。