實(shí)戰(zhàn):從環(huán)境搭建到項(xiàng)目發(fā)布全流程指南)
1. 從“Hello World”到“能干活”為什么選擇QT6 Widgets如果你剛接觸桌面應(yīng)用開發(fā)或者從其他GUI框架比如MFC、WinForm轉(zhuǎn)過來面對QT這個(gè)龐然大物第一反應(yīng)可能是有點(diǎn)懵。官方文檔很全但內(nèi)容太多網(wǎng)上教程不少但質(zhì)量參差不齊很多還停留在QT4、QT5時(shí)代。你真正需要的可能不是一本百科全書而是一條能讓你快速上手、把想法變成可運(yùn)行界面的“捷徑”。QT6 Widgets模塊就是這條捷徑。它不像QML那樣需要學(xué)習(xí)一套聲明式的語法和JavaScript也不像Quick那樣對圖形性能有極致要求。Widgets的核心思想非常直接所見即所得的控件堆疊。按鈕、文本框、標(biāo)簽、列表這些就是一個(gè)個(gè)“零件”Widget你把它們拖到窗口也是一個(gè)Widget上設(shè)置位置、大小、響應(yīng)事件一個(gè)桌面應(yīng)用的基本骨架就出來了。這種開發(fā)模式對于有C基礎(chǔ)、習(xí)慣面向?qū)ο缶幊獭⑿枰焖匍_發(fā)業(yè)務(wù)邏輯密集型的傳統(tǒng)桌面軟件如工具軟件、數(shù)據(jù)管理后臺、工業(yè)控制界面的開發(fā)者來說學(xué)習(xí)曲線平緩生產(chǎn)力釋放迅速。我見過不少團(tuán)隊(duì)在技術(shù)選型時(shí)糾結(jié)是上QML追求酷炫的界面動(dòng)畫還是用Widgets保證開發(fā)效率和穩(wěn)定性。我的經(jīng)驗(yàn)是除非你的應(yīng)用對UI動(dòng)效和跨移動(dòng)端有硬性要求否則Widgets在絕大多數(shù)桌面場景下都是更務(wù)實(shí)、更高效的選擇。QT6對Widgets模塊進(jìn)行了大量現(xiàn)代化改造比如引入了新的圖形后端、更好的高DPI支持、更簡潔的API讓它老當(dāng)益壯。接下來我就帶你繞過那些繁瑣的理論直接進(jìn)入實(shí)戰(zhàn)用最短的時(shí)間搭建起一個(gè)可用的QT6 Widgets開發(fā)環(huán)境并完成你的第一個(gè)“五臟俱全”的小應(yīng)用。2. 環(huán)境搭建避開安裝與配置的那些“坑”工欲善其事必先利其器。QT6的安裝看似簡單但細(xì)節(jié)沒處理好后面編譯、調(diào)試會(huì)處處碰壁。2.1 安裝器選擇與組件勾選首先去QT官網(wǎng)下載在線安裝器。這里第一個(gè)坑就來了不要盲目安裝最新版本。QT的版本迭代很快但一些第三方庫尤其是閉源庫的適配可能會(huì)滯后。對于新手和追求穩(wěn)定的項(xiàng)目我建議選擇QT 6.2 LTS或6.5 LTS這類長期支持版本。它們經(jīng)過了更長時(shí)間的測試社區(qū)資源也更豐富。運(yùn)行安裝器登錄QT賬號后來到組件選擇頁面。這里列表很長容易讓人眼花繚亂。對于Widgets快速開發(fā)你只需要關(guān)注這幾個(gè)核心組件QT 6.x.x 這是主框架必須勾選。MSVC 2019 64-bit或MinGW 11.2.0 64-bit 這是編譯器套件。如果你在Windows上且安裝了Visual Studio就選MSVC版本調(diào)試體驗(yàn)更好。如果追求純凈和跨平臺一致性或者沒有VS就選MinGW。兩者選一個(gè)即可不要全選避免環(huán)境變量沖突。Qt Creator 11.0.x 這是QT的官方IDE對QT項(xiàng)目支持最好強(qiáng)烈建議安裝。即使你習(xí)慣用VS Code或CLion初期也建議用Qt Creator來理解和建立項(xiàng)目結(jié)構(gòu)。Sources QT的源代碼。這個(gè)建議勾選以后調(diào)試時(shí)如果能步入QT的源碼對理解內(nèi)部機(jī)制有巨大幫助。Qt 5 Compatibility Module 如果你有舊的QT5代碼需要遷移可以勾選。全新項(xiàng)目可以不選。至于Android、iOS、WebAssembly等除非你明確要開發(fā)對應(yīng)平臺的應(yīng)用否則一律不選以節(jié)省磁盤空間和安裝時(shí)間。注意安裝路徑不要包含中文或空格。像C:\Program Files\Qt或D:\Qt\6.5.0都是安全的選擇。路徑中有空格可能導(dǎo)致一些基于Makefile的腳本或第三方工具出錯(cuò)。2.2 第一個(gè)項(xiàng)目的創(chuàng)建與配置解讀安裝完成后打開Qt Creator。點(diǎn)擊“New Project”選擇“Application” - “Qt Widgets Application”。給項(xiàng)目起名比如MyFirstWidgetApp。在“Kit Selection”頁面確保勾選了你在上一步安裝的編譯器套件如Desktop Qt 6.5.0 MSVC2019 64bit。點(diǎn)擊完成Qt Creator會(huì)自動(dòng)生成一個(gè)最基本的窗口應(yīng)用。我們來看看生成的核心文件main.cpp: 程序入口。里面創(chuàng)建了QApplication對象管理整個(gè)GUI應(yīng)用的生命周期和主窗口對象然后調(diào)用window.show()顯示窗口最后進(jìn)入事件循環(huán)app.exec()。mainwindow.h/mainwindow.cpp/mainwindow.ui: 這是主窗口的類定義、實(shí)現(xiàn)和UI設(shè)計(jì)文件。.ui文件是Qt Designer格式的XML文件你可以用Qt Creator內(nèi)置的設(shè)計(jì)器以拖拽方式設(shè)計(jì)界面。這里有一個(gè)關(guān)鍵點(diǎn).ui文件最終會(huì)被Qt的構(gòu)建系統(tǒng)qmake或CMake編譯成C頭文件ui_mainwindow.h。在mainwindow.cpp的構(gòu)造函數(shù)里你會(huì)看到ui-setupUi(this);這行代碼它的作用就是根據(jù)編譯好的UI頭文件動(dòng)態(tài)創(chuàng)建出你在設(shè)計(jì)器里擺放的所有控件。這意味著你幾乎不需要手動(dòng)用C代碼去創(chuàng)建和布局一個(gè)按鈕或標(biāo)簽大大提升了開發(fā)效率。2.3 構(gòu)建系統(tǒng)qmake還是CMakeQT6項(xiàng)目默認(rèn)使用CMake作為構(gòu)建系統(tǒng)這是大勢所趨。CMake功能更強(qiáng)大生態(tài)更好尤其是在管理復(fù)雜項(xiàng)目、引入第三方庫時(shí)。雖然qmake對QT項(xiàng)目更“原生”和簡單但我強(qiáng)烈建議從QT6開始直接擁抱CMake。它初學(xué)有點(diǎn)門檻但長遠(yuǎn)來看收益巨大。Qt Creator對CMake項(xiàng)目的支持已經(jīng)非常完善。打開項(xiàng)目根目錄下的CMakeLists.txt文件你會(huì)看到類似這樣的內(nèi)容cmake_minimum_required(VERSION 3.16) project(MyFirstWidgetApp VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Qt6 REQUIRED COMPONENTS Widgets) qt_standard_project_setup() qt_add_executable(MyFirstWidgetApp main.cpp mainwindow.cpp mainwindow.h mainwindow.ui ) target_link_libraries(MyFirstWidgetApp PRIVATE Qt6::Widgets) set_target_properties(MyFirstWidgetApp PROPERTIES WIN32_EXECUTABLE ON )這段CMake腳本做了幾件事指定CMake版本、項(xiàng)目名和C標(biāo)準(zhǔn)查找QT6的Widgets模塊將源文件添加到可執(zhí)行目標(biāo)將QT6 Widgets庫鏈接到目標(biāo)在Windows上設(shè)置生成GUI子系統(tǒng)程序沒有控制臺窗口。理解這個(gè)基本結(jié)構(gòu)是你日后擴(kuò)展項(xiàng)目的基礎(chǔ)。3. 核心控件與布局管理器告別絕對定位用代碼設(shè)置每個(gè)控件像素級的x, y坐標(biāo)是GUI開發(fā)的大忌。屏幕分辨率一變界面就全亂了。Qt通過布局管理器Layout來解決這個(gè)問題。3.1 常用基礎(chǔ)控件速覽在Qt Designer里左側(cè)工具箱有豐富的控件。對于快速開發(fā)先掌握這幾個(gè)核心QPushButton: 按鈕。最常用的交互控件。QLabel: 標(biāo)簽。用于顯示文本或圖片。QLineEdit: 單行文本框。用于輸入簡短文本。QTextEdit: 多行富文本編輯器。功能強(qiáng)大。QComboBox: 下拉列表框。QListWidget / QTableView: 列表和表格視圖用于展示數(shù)據(jù)集合。QProgressBar: 進(jìn)度條。QSlider / QSpinBox: 滑塊和數(shù)字微調(diào)框用于輸入數(shù)值。每個(gè)控件都有大量的屬性Property可以在設(shè)計(jì)器的右側(cè)“屬性編輯器”中設(shè)置比如對象的名稱objectName用于在代碼中引用、文本text、是否啟用enabled、樣式表styleSheet等。3.2 布局管理器的實(shí)戰(zhàn)應(yīng)用布局管理器是Widgets界面規(guī)整的靈魂。主要有四種水平布局QHBoxLayout 將內(nèi)部的控件從左到右水平排列。垂直布局QVBoxLayout 將內(nèi)部的控件從上到下垂直排列。網(wǎng)格布局QGridLayout 將界面劃分為行和列的網(wǎng)格控件可以放置在任何單元格并能跨行跨列。表單布局QFormLayout 特別適合制作“標(biāo)簽-輸入框”成對出現(xiàn)的表單界面。實(shí)操技巧如何構(gòu)建一個(gè)復(fù)雜的對話框假設(shè)我們要做一個(gè)簡單的用戶信息編輯對話框包含“姓名”、“年齡”、“城市”和“確定”、“取消”按鈕。首先在窗口上拖入一個(gè)QWidget作為容器因?yàn)椴季直仨毷┘佑谝粋€(gè)Widget或其子類上。選中這個(gè)容器Widget右鍵 - “布局” - “垂直布局”?,F(xiàn)在這個(gè)容器就有了一個(gè)垂直布局。向這個(gè)垂直布局里拖入三個(gè)QLineEdit它們會(huì)自動(dòng)垂直排列。但這不對我們需要標(biāo)簽。更高效的做法直接使用“表單布局”。拖一個(gè)QFormLayout到窗口上然后在設(shè)計(jì)器中你可以直接一行行地添加“標(biāo)簽-控件”對。對于“年齡”可以搭配QSpinBox。最后在表單布局下方我們需要兩個(gè)按鈕水平排列??梢栽偻先胍粋€(gè)QWidget容器對其應(yīng)用水平布局然后放入兩個(gè)QPushButton。最后將這個(gè)按鈕容器Widget拖到表單布局所在的垂直布局或窗口的主垂直布局中。通過嵌套使用不同的布局管理器你可以構(gòu)建出任何復(fù)雜的、能自適應(yīng)窗口大小的界面。記住一個(gè)原則先布局后微調(diào)。用布局管理器確定大框架和控件間的相對關(guān)系再用“最小大小”、“最大大小”、“大小策略”等屬性進(jìn)行精細(xì)調(diào)整而不是一開始就去改控件的幾何尺寸。3.3 對象命名與代碼關(guān)聯(lián)在設(shè)計(jì)器里擺好控件后關(guān)鍵一步是給重要的控件起一個(gè)有意義且統(tǒng)一的objectName比如nameLineEdit、ageSpinBox、okButton。這是你在C代碼中引用它們的唯一標(biāo)識符。如何關(guān)聯(lián)Qt使用信號與槽Signals Slots機(jī)制這是Qt的核心特性用于對象間的通信。一個(gè)控件信號發(fā)送者狀態(tài)改變時(shí)發(fā)出“信號”另一個(gè)對象槽函數(shù)擁有者的“槽函數(shù)”會(huì)被自動(dòng)調(diào)用。在Qt Creator里關(guān)聯(lián)信號與槽最簡單的方式是使用“轉(zhuǎn)到槽”功能。右鍵設(shè)計(jì)器中的按鈕如okButton選擇“轉(zhuǎn)到槽...”然后選擇clicked()信號。Qt Creator會(huì)自動(dòng)在mainwindow.cpp中生成一個(gè)名為on_okButton_clicked()的槽函數(shù)并建立好連接。你只需要在這個(gè)函數(shù)里編寫點(diǎn)擊按鈕后要執(zhí)行的邏輯即可。這種基于命名規(guī)則的自動(dòng)連接on_objectName_signalName非常方便但對于復(fù)雜的動(dòng)態(tài)連接或者為了更好的代碼結(jié)構(gòu)我們也需要掌握手動(dòng)連接的方式// 在MainWindow的構(gòu)造函數(shù)或某個(gè)初始化函數(shù)中 connect(ui-okButton, QPushButton::clicked, this, MainWindow::handleOkButtonClick); // 然后需要自己聲明和定義 handleOkButtonClick 這個(gè)槽函數(shù) void MainWindow::handleOkButtonClick() { QString name ui-nameLineEdit-text(); int age ui-ageSpinBox-value(); // ... 處理數(shù)據(jù) }手動(dòng)連接更靈活可以將信號連接到任意符合簽名的成員函數(shù)、靜態(tài)函數(shù)甚至Lambda表達(dá)式上。4. 數(shù)據(jù)與界面的橋梁Model/View 編程初探當(dāng)你的應(yīng)用需要顯示列表、表格或樹形等結(jié)構(gòu)化數(shù)據(jù)時(shí)直接操作QListWidget、QTableWidget的每一項(xiàng)會(huì)非常低效且代碼臃腫。Qt提供了更高級的Model/View模型/視圖架構(gòu)來優(yōu)雅地解決這個(gè)問題。4.1 理解Model/View的核心思想這個(gè)架構(gòu)將數(shù)據(jù)和顯示分離模型Model 負(fù)責(zé)管理數(shù)據(jù)。它不關(guān)心數(shù)據(jù)如何顯示。視圖View 負(fù)責(zé)顯示數(shù)據(jù)。它從模型獲取數(shù)據(jù)來渲染。委托Delegate 負(fù)責(zé)渲染視圖中的每個(gè)數(shù)據(jù)項(xiàng)并處理編輯操作。這種分離的好處是巨大的一份數(shù)據(jù)模型可以被多個(gè)不同的視圖共享比如同一個(gè)數(shù)據(jù)既用表格顯示又用圖表顯示修改數(shù)據(jù)時(shí)只需更新模型所有關(guān)聯(lián)的視圖會(huì)自動(dòng)刷新對于大型數(shù)據(jù)集視圖可以只請求需要顯示的部分?jǐn)?shù)據(jù)效率高。4.2 使用預(yù)定義模型以QTableView為例對于常見的數(shù)據(jù)結(jié)構(gòu)Qt提供了現(xiàn)成的模型類如QStringListModel字符串列表、QFileSystemModel文件系統(tǒng)、QSqlQueryModel數(shù)據(jù)庫查詢結(jié)果。使用它們能極大簡化開發(fā)。假設(shè)我們有一個(gè)QVectorPerson的人員數(shù)據(jù)想在表格中顯示。一種快速但不推薦的做法是使用QTableWidget然后通過循環(huán)插入行和列來設(shè)置數(shù)據(jù)。推薦的做法是使用QTableView搭配一個(gè)自定義模型。但在此之前我們先看一個(gè)簡單的例子使用QStandardItemModel它是一個(gè)通用的、基于項(xiàng)的模型適合中等規(guī)模、結(jié)構(gòu)可變的數(shù)據(jù)// 在MainWindow類中 #include QStandardItemModel // 初始化模型和視圖 QStandardItemModel *model new QStandardItemModel(this); ui-tableView-setModel(model); // 假設(shè)設(shè)計(jì)器里有一個(gè) tableView // 設(shè)置表頭 model-setHorizontalHeaderLabels(QStringList() 姓名 年齡 城市); // 添加數(shù)據(jù) QListQStandardItem* rowItems; rowItems new QStandardItem(張三) new QStandardItem(25) new QStandardItem(北京); model-appendRow(rowItems); // 再添加一行 rowItems.clear(); rowItems new QStandardItem(李四) new QStandardItem(30) new QStandardItem(上海); model-appendRow(rowItems);這樣數(shù)據(jù)就顯示在表格里了。如果我們在代碼中修改了某個(gè)QStandardItem的數(shù)據(jù)表格視圖會(huì)自動(dòng)更新。反之如果用戶在表格里編輯了單元格模型里的數(shù)據(jù)也會(huì)自動(dòng)更新。這就是Model/View的威力。4.3 邁向自定義模型當(dāng)數(shù)據(jù)源是自定義數(shù)據(jù)結(jié)構(gòu)如從網(wǎng)絡(luò)API獲取的JSON、從文件讀取的特定格式數(shù)據(jù)或數(shù)據(jù)集非常大時(shí)QStandardItemModel可能就不夠高效或靈活了。這時(shí)需要子類化QAbstractItemModel或其子類如QAbstractTableModel來創(chuàng)建自定義模型。創(chuàng)建自定義模型需要實(shí)現(xiàn)幾個(gè)關(guān)鍵的純虛函數(shù)如rowCount(),columnCount(),data(),setData(),headerData()等。這比使用現(xiàn)成模型復(fù)雜但提供了完全的控制權(quán)和最佳性能。對于快速開發(fā)我建議先使用QStandardItemModel或QSqlQueryModel這類內(nèi)置模型實(shí)現(xiàn)功能待遇到性能瓶頸或特殊需求時(shí)再考慮實(shí)現(xiàn)自定義模型。5. 樣式美化與國際化讓應(yīng)用更專業(yè)一個(gè)看起來舒服、符合用戶區(qū)域習(xí)慣的應(yīng)用能大大提升體驗(yàn)。Qt在這兩方面提供了強(qiáng)大的支持。5.1 使用Qt樣式表QSSQt樣式表QSS的語法幾乎和CSS網(wǎng)頁樣式表一樣。你可以為整個(gè)應(yīng)用、某個(gè)窗口或單個(gè)控件設(shè)置樣式?;居梅?/ 設(shè)置按鈕的背景色、文字顏色和圓角 ui-pushButton-setStyleSheet(QPushButton { background-color: #4CAF50; color: white; border-radius: 5px; }); // 設(shè)置按鈕在鼠標(biāo)懸停時(shí)的樣式 ui-pushButton-setStyleSheet(QPushButton:hover { background-color: #45a049; });更常見的做法是將樣式表寫在一個(gè).qss文件里在程序啟動(dòng)時(shí)加載// 在main函數(shù)或主窗口初始化時(shí) QFile file(:/style.qss); // 假設(shè)樣式表已加入資源文件 file.open(QFile::ReadOnly); QString styleSheet QLatin1String(file.readAll()); qApp-setStyleSheet(styleSheet); // 應(yīng)用到整個(gè)應(yīng)用程序QSS選擇器支持類名如QPushButton、對象名如#okButton、偽狀態(tài)如:hover,:pressed,:checked等非常靈活。通過QSS你可以輕松實(shí)現(xiàn)扁平化、擬物化等各種視覺風(fēng)格而無需重寫控件的繪制代碼。注意過度使用或編寫復(fù)雜的QSS可能會(huì)影響性能尤其是在需要頻繁更新樣式的動(dòng)態(tài)控件上。對于簡單的顏色、字體修改QSS是首選對于需要復(fù)雜自定義繪制的控件可能需要子類化控件并重寫其paintEvent。5.2 應(yīng)用國際化i18n國際化意味著讓你的應(yīng)用能夠輕松適配不同語言和區(qū)域。Qt使用tr()函數(shù)來標(biāo)記所有需要翻譯的用戶可見字符串。步驟一在代碼中標(biāo)記字符串在任何需要翻譯的字符串外加上tr()例如ui-label-setText(tr(Welcome to My Application)); QMessageBox::information(this, tr(Info), tr(Operation completed successfully.));步驟二生成翻譯源文件.ts在項(xiàng)目的.pro文件如果使用qmake或CMakeLists.txt中配置翻譯文件。以CMake為例可以使用qt_add_translations命令。更通用的方法是使用lupdate工具掃描源代碼提取所有tr()中的字符串生成.ts文件一種XML格式lupdate myproject.pro -ts myapp_zh_CN.ts步驟三翻譯使用Qt Linguist工具打開.ts文件為每個(gè)源字符串填寫目標(biāo)語言的翻譯。步驟四發(fā)布翻譯文件使用lrelease工具將.ts文件編譯成更高效的.qm文件二進(jìn)制格式lrelease myapp_zh_CN.ts步驟五在應(yīng)用中加載翻譯在main函數(shù)中根據(jù)用戶的語言環(huán)境加載對應(yīng)的.qm文件#include QTranslator int main(int argc, char *argv[]) { QApplication a(argc, argv); QTranslator translator; if (translator.load(:/translations/myapp_zh_CN.qm)) { // 從資源文件加載 a.installTranslator(translator); } MainWindow w; w.show(); return a.exec(); }這樣當(dāng)應(yīng)用運(yùn)行時(shí)所有被tr()包裹的字符串都會(huì)自動(dòng)替換為翻譯后的文本。國際化是一個(gè)系統(tǒng)工程還包括對日期、時(shí)間、數(shù)字格式、布局考慮文字長度等的處理但tr()是其中最基礎(chǔ)也是最重要的一步。6. 項(xiàng)目組織與發(fā)布部署當(dāng)你的應(yīng)用功能越來越復(fù)雜代碼量變大就需要良好的項(xiàng)目組織。同時(shí)開發(fā)完成后如何打包成一個(gè)用戶可以獨(dú)立運(yùn)行的安裝包是最后也是關(guān)鍵的一步。6.1 多模塊項(xiàng)目組織不要把所有代碼都堆在mainwindow.cpp里。合理的做法是根據(jù)功能進(jìn)行模塊化拆分核心業(yè)務(wù)邏輯 放在獨(dú)立的類或命名空間中與UI無關(guān)。例如一個(gè)DataProcessor類負(fù)責(zé)數(shù)據(jù)計(jì)算。自定義控件 如果某個(gè)控件組合比如一個(gè)帶搜索框的列表在多處使用就把它封裝成一個(gè)新的QWidget子類。對話框 每個(gè)獨(dú)立的對話框都應(yīng)該有自己的類QDialog子類和對應(yīng)的.ui、.h、.cpp文件。資源管理 將圖片、圖標(biāo)、樣式表、翻譯文件等通過Qt的資源系統(tǒng).qrc文件進(jìn)行管理編譯進(jìn)可執(zhí)行文件避免發(fā)布時(shí)文件丟失。在CMake中可以通過add_library創(chuàng)建靜態(tài)或動(dòng)態(tài)庫將核心模塊編譯成庫供主程序和其他模塊調(diào)用實(shí)現(xiàn)更好的解耦和復(fù)用。6.2 調(diào)試技巧讓問題無處遁形Qt Creator提供了強(qiáng)大的調(diào)試功能。除了常規(guī)的斷點(diǎn)、單步執(zhí)行、查看變量外有幾個(gè)Qt特有的技巧qDebug() 輸出 在代碼中使用qDebug() 變量值 myVar;可以輸出信息到“應(yīng)用程序輸出”面板。這是最快速的調(diào)試手段之一。Qt Creator 的“Locals and Expressions” 在調(diào)試時(shí)可以查看和修改任何QObject派生類對象的屬性非常直觀。檢查信號與槽連接 在調(diào)試模式下可以在Qt Creator的“調(diào)試”視圖中查看所有活躍的信號與槽連接。6.3 打包發(fā)布生成獨(dú)立可執(zhí)行文件在開發(fā)環(huán)境下你的程序依賴Qt的動(dòng)態(tài)鏈接庫DLL。要讓它在沒有安裝Qt的電腦上運(yùn)行需要將這些依賴一起打包。Windows平臺最常用的工具是windeployqt。它位于Qt安裝目錄的bin文件夾下。使用方法很簡單首先將你的Release版本的可執(zhí)行文件.exe復(fù)制到一個(gè)空文件夾比如MyAppRelease。打開Qt 6.5.0 MSVC2019 64-bit命令行在開始菜單的Qt文件夾里能找到這個(gè)環(huán)境已經(jīng)配置好了Qt的路徑。切換到你的MyAppRelease目錄然后執(zhí)行windeployqt MyFirstWidgetApp.exe這個(gè)命令會(huì)自動(dòng)掃描你的.exe文件找出它依賴的Qt庫、插件如圖像格式支持、平臺插件等并復(fù)制到當(dāng)前目錄。它還會(huì)生成一個(gè)qt.conf文件來幫助程序定位這些資源。但是windeployqt并不完美它可能遺漏一些非Qt的依賴比如VC運(yùn)行時(shí)庫或者你自己項(xiàng)目中的資源文件如圖片、數(shù)據(jù)庫文件。因此發(fā)布前必須進(jìn)行徹底的測試將整個(gè)MyAppRelease文件夾復(fù)制到一臺沒有安裝Qt和Visual Studio的純凈Windows虛擬機(jī)或電腦上。直接雙擊運(yùn)行.exe文件看是否能正常啟動(dòng)所有功能是否完好。檢查是否有缺失的DLL運(yùn)行時(shí)會(huì)彈出錯(cuò)誤框如果有手動(dòng)補(bǔ)上。對于VC運(yùn)行時(shí)庫你可以選擇讓用戶自行安裝微軟官方運(yùn)行庫或者使用工具將其合并到你的安裝包中。最后使用專業(yè)的安裝包制作工具如 Inno Setup、NSIS、Advanced Installer將整個(gè)文件夾打包成一個(gè).exe安裝程序并添加快捷方式、注冊表項(xiàng)等一個(gè)專業(yè)的桌面應(yīng)用就準(zhǔn)備分發(fā)給用戶了。從環(huán)境搭建到發(fā)布部署這條路徑上的每個(gè)環(huán)節(jié)都有需要注意的細(xì)節(jié)。Widgets開發(fā)的核心在于“快速”將想法實(shí)現(xiàn)為可交互的界面同時(shí)保證代碼的可維護(hù)性和最終產(chǎn)品的專業(yè)性。避開那些常見的坑善用Qt提供的強(qiáng)大工具和框架你就能在桌面開發(fā)的路上走得更穩(wěn)、更快。