【AI時代速通QT】第二節:Qt SDK 的目錄介紹和第一個Qt Creator項目

目錄

一、認識 Qt SDK 的目錄結構

二、第一個 Qt 程序

2.1 Qt Creator 創建項目

2.2 介紹項目各文件

三、揭秘 Qt 的構建過程

四、運行項目與總結


?

?🎬 攻城獅7號個人主頁

🔥 個人專欄:C++QT跨平臺界面編程

?? 君子慎獨!

?🌈 大家好,歡迎來訪我的博客!
?? 此篇文章主要介紹 Qt SDK 的目錄和第一個Qt Creator項目
📚 本期文章收錄在《C++QT跨平臺界面編程》,大家有興趣可以自行查看!
?? 歡迎各位 ?? 點贊 👍 收藏 ?留言 📝!

一、認識 Qt SDK 的目錄結構

????????在我們開始創建項目之前,先花點時間了解一下 Qt SDK 安裝后的目錄結構是很有幫助的。這能讓你明白編譯、鏈接和運行一個 Qt 程序時,那些必要的文件都來自哪里。

????????以一個典型的 Qt 安裝目錄為例(比如 `C:\Qt\Qt5.9.0`),你會看到幾個關鍵的子目錄:

????????進去5.9 目錄,會看到`msvc2015_64` / `mingw53_32` 等,這些是以 "編譯器_平臺" 命名的目錄,是你為特定平臺開發時真正用到的核心。其中Src是QT源碼目錄。

????????每個這樣的目錄里都包含:

(1)`bin`: 存放著可執行文件和動態鏈接庫(DLL)。這里面不僅有你程序運行時依賴的 `Qt5Core.dll`、`Qt5Gui.dll` 等,還有 Qt 開發工具鏈三劍客:`qmake.exe`(處理.pro文件生成Makefile)、`moc.exe`(元對象編譯器)和 `uic.exe`(UI編譯器)。Qt Designer (`designer.exe`) 和 Qt Assistant (`assistant.exe`,用于查閱官方文檔) 也在這里。

????????Qt Designer的功能:可視化 UI 設計工具,通過拖拽組件(按鈕、文本框等)快速創建界面,生成.ui文件。

????????Qt Assistant的功能:集成式文檔瀏覽器,提供 Qt 框架的官方文檔、示例代碼和 API 參考。

(2) `include`: 存放所有 Qt 模塊的頭文件(`.h`)。你在代碼中 `#include <QWidget>` 時,編譯器就是在這里找到對應的文件。

(3) `lib`: 存放庫文件(`.lib`)。鏈接器在生成最終可執行文件時,需要這些文件來解析 Qt 的函數調用。

????????簡單來說,你在 Qt Creator 中選擇一個"Kit"(構建套件,例如 `Desktop Qt 5.9.0 MSVC2015 64bit`),實際上就是指定了使用哪個編譯器目錄下的 `bin`, `include`, `lib` 來編譯和鏈接你的項目。

????????下面是其他幾個主要的5.9 的同級目錄:

(1)`plugins`: 存放各類插件。比如,讓你的程序能顯示 JPG、GIF 圖片的圖像格式插件,或者連接 MySQL、SQLite 數據庫的驅動插件。發布程序時,往往需要把用到的插件(通常是整個目錄)一并打包。

(2)`Tools`: 包含了一些工具,比如 Qt Creator IDE 本身,以及可能的第三方編譯器套件(如 MinGW)。

(3)`Examples`: 包含了大量的官方示例項目源碼,是學習 Qt 非常好的參考資料。

(4)`Docs`: 存放著 Qt 的所有離線幫助文檔。

二、第一個 Qt 程序

2.1 Qt Creator 創建項目

????????現在我們用 Qt Creator 創建一個最基礎的 Qt Widgets 應用,首先是打開通過C:\Qt\Qt5.9.0\Tools\QtCreator\bin\qtcreator.exe 雙擊打開Qt Creator,或者在快速啟動欄點擊打開。按如下新建項目:

????????如下選擇項目類型:

????????如下填入項目名稱和路徑,路徑最好是英文。 然后下一步

????????如下只選擇一個編譯環境?

????????下一步自定義各文件,文件名稱最好都是小寫,避免代碼遷移到linux平臺,區分大小的不小心容易出錯

?如下便創建好了項目

????????其中widget.ui文件可以雙擊打開,如下拖放一個按鈕控件上去,點擊編輯模式,可以看到其ui代碼

如下是上面的項目testqt源碼文件:

2.2 介紹項目各文件

(1) `.pro` - 項目配置文件

????????這是一個項目(Project)文件,由 qmake 工具處理。它告訴 Qt 要如何編譯你的項目。

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = testqtTEMPLATE = appSOURCES += main.cpp widget.cppHEADERS += widget.hFORMS += widget.ui

?

* ? `QT += core gui widgets`:聲明項目需要用到 Qt 的核心、GUI 和窗口部件模塊。qmake會據此去`lib`目錄和`include`目錄引用對應的庫和頭文件。

* ? `TARGET = testqt`:指定生成的可執行程序的名字。

* ? `TEMPLATE = app`:指定這是一個應用程序(app)項目。

* ? `SOURCES`、`HEADERS`、`FORMS`:分別列出了項目包含的源文件、頭文件和界面文件。qmake會根據這些清單來決定哪些文件需要被編譯,哪些需要被`moc`或`uic`處理。

(2)`.pro.user` - 用戶配置文件(重要概念)

????????在你的項目目錄下,還會看到一個 `testqt.pro.user` 文件。這個文件非常重要但它不應該被包含在版本控制中(如 Git)。

????????它存儲的是你本地開發環境的配置,比如你選擇了哪個 Qt 版本和編譯器(即哪個 Kit),以及你的項目構建目錄在哪里等等。當你把項目發給別人時,應該刪掉這個文件。對方用他的 Qt Creator 打開 `.pro` 文件時,會自動生成一份適合他自己環境的 `.pro.user` 文件。

(3) `main.cpp` - 程序入口

????????和所有 C++ 程序一樣,`main` 函數是程序的起點。

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[]){// 1. 創建 QApplication 實例,它是 Qt 程序的管理者QApplication a(argc, argv);// 2. 創建我們自己的窗口類 Widget 的實例Widget w;// 3. 顯示窗口w.show();// 4. 進入事件循環,等待用戶操作 (如點擊鼠標、按下鍵盤)return a.exec();}

? ? ? ??這個文件很固定,對于大部分應用來說,你幾乎不需要修改它。

(4) `widget.h` & `widget.cpp` - 窗口的定義與實現

????????這兩個文件定義了我們主窗口的行為。

`widget.h` (頭文件 - 聲明)

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECT // 重點:Qt 的"魔法"宏,使用信號與槽必須包含它public:explicit Widget(QWidget *parent = 0);~Widget();private:Ui::Widget *ui; // 重點:指向界面設計的指針
};#endif // WIDGET_H

* ? `class Widget : public QWidget`:我們的窗口類 `Widget` 繼承自 Qt 的基礎窗口部件 `QWidget`。

* ? `Q_OBJECT`:一個特殊的宏。只要你想在類中使用 Qt 強大的"信號與槽"機制,就必須加上它。`moc`工具會專門處理它。

* ? `Ui::Widget *ui;`:這是一個關鍵的指針。它指向由 `widget.ui` 文件生成的那個界面。通過 `ui` 指針,我們就可以在 C++ 代碼中訪問界面上的所有元素(比如按鈕、輸入框等)。

`widget.cpp` (源文件 - 實現)

#include "widget.h"
#include "ui_widget.h" // 重點:包含了 .ui 文件編譯后生成的頭文件Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{// 這行代碼將 .ui 文件中設計的界面和當前的 C++ 代碼"關聯"起來ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}

?

* ? `ui->setupUi(this);` 是最重要的部分。它會讀取 `.ui` 文件內容,并將其中設計的按鈕等控件實例化,把它們"畫"在 `Widget` 這個窗口上。

(5) `widget.ui` - 界面設計文件

????????這是一個 XML 文件,用 Qt Creator 的設計模式打開時,你可以通過拖拽的方式來設計界面。

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>Widget</class><widget class="QWidget" name="Widget"><property name="geometry"><rect><x>0</x><y>0</y><width>671</width><height>478</height></rect></property><property name="windowTitle"><string>Widget</string></property><widget class="QPushButton" name="pushButton"><property name="geometry"><rect><x>230</x><y>170</y><width>191</width><height>101</height></rect></property><property name="text"><string>PushButton</string></property></widget></widget><layoutdefault spacing="6" margin="11"/><resources/><connections/>
</ui>

????????可以看到,我們在界面上放了一個 `QPushButton`,它的 `name` 是 `pushButton`,顯示的文本是 `PushButton`。在 C++ 代碼中,我們就可以通過 `ui->pushButton` 來訪問這個按鈕。

三、揭秘 Qt 的構建過程

????????當你點擊"運行"按鈕時,Qt Creator 在背后為你做了幾件重要的事情,最終才生成了可執行文件。這個過程通常發生在一個單獨的構建目錄中(比如 `build-testqt-Desktop_Qt_5_9_0...`)。

(1)`qmake` 生成 Makefile:`qmake.exe` 首先讀取你的 `testqt.pro` 文件。根據里面的配置,它會生成一個 `Makefile`(以及 `Makefile.Debug` 和 `Makefile.Release`)。Makefile 是一個構建規則文件,它精確定義了接下來需要執行的所有編譯和鏈接命令。

(2)`uic` (User Interface Compiler) 編譯 UI 文件:在編譯過程中,`uic.exe` 會被調用。它讀取 `widget.ui` 這個 XML 文件,并把它轉換成一個標準的 C++ 頭文件,名為 `ui_widget.h`。這個頭文件里定義了 `Ui::Widget` 類,并包含了創建所有界面控件(如 `pushButton`)的代碼。這個文件也被生成在構建目錄中。

(3)`moc` (Meta-Object Compiler) 處理元對象:接下來,`moc.exe` 會掃描你所有聲明了 `Q_OBJECT` 的頭文件(這里是 `widget.h`)。它會為這個類生成一些額外的 C++ 代碼(保存在 `moc_widget.cpp` 中),用于實現信號與槽等高級功能。

(4)C++ 編譯器編譯所有源文件:最后,你的 C++ 編譯器(如 MSVC 或 MinGW)會編譯所有的 `.cpp` 文件,這包括:

? ? * ? 你自己寫的 `main.cpp` 和 `widget.cpp`。

? ? * ? 由 `moc` 生成的 `moc_widget.cpp`。

(5)鏈接器生成可執行文件:編譯器將所有源文件編譯成目標文件(`.obj`)后,鏈接器會把這些目標文件與 Qt 庫(`.lib` 文件)鏈接起來,最終生成 `testqt.exe` 這個可執行文件。

????????了解這個過程有助于你排查一些奇怪的編譯錯誤。比如,如果你修改了 UI 文件但表現不正確,可能是 `uic` 沒有重新運行;如果信號槽不工作,有時是 `moc` 過程出了問題。這時,執行一次"清理項目"再"重新構建"通常能解決問題。

四、運行項目與總結

????????現在,重新編譯并運行程序。軟件左下角按順序的按鈕分別是,運行,編譯,構建

下面是它們的使用場景

?運行和構建的區別如下:

下面是程序運行的截圖:?

?

總結

????????通過這個簡單的例子,我們了解了:

????????(1)Qt SDK 的目錄結構,以及 `bin`、`lib`、`include` 的作用。

????????(2)一個 Qt 項目由 `.pro`、`.h`、`.cpp`、`.ui` 等文件組成,以及重要的 `.pro.user` 文件。

????????(3)Qt 通過 `qmake`、`uic` 和 `moc` 等工具將項目文件轉換、編譯并鏈接成可執行程序。

????????這只是 Qt 世界的冰山一角。接下來,你可以嘗試在界面上添加更多的控件(如 `QLabel`, `QLineEdit`),并用信號與槽將它們的功能連接起來,繼續你的探索之旅。關于信號和槽的概念學習我們后續章節見。

看到這里了還不給博主點一個:
?? 點贊??收藏 ?? 關注

💛 💙 💜 ?? 💚💓 💗 💕 💞 💘 💖
再次感謝大家的支持!
你們的點贊就是博主更新最大的動力!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87663.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87663.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87663.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CDH部署Hive詳細指南

CDH部署Hive詳細指南 本文將詳細介紹如何使用Cloudera Manager Web界面部署Hive組件,包括安裝、配置、優化和運維管理等內容。 1. 環境準備 1.1 系統要求 1.1.1 硬件要求 服務器配置 CPU:建議8核以上內存:建議32GB以上磁盤:建議使用企業級SAS或SSD網絡:建議萬兆網絡集…

黨建賦能 醫校協同|廣州附醫華南醫院與湖南中醫藥高等專科學校簽約攜手共育英才

為深入貫徹落實黨中央、國務院關于高校畢業生就業創業工作決策部署&#xff0c;教育部印發《職業學校校企合作促進辦法》&#xff0c;對深化醫教協同提供了政策指引。在醫學教育領域&#xff0c;鼓勵醫學院校與醫療機構開展深度合作&#xff0c;根據醫療行業需求調整專業設置與…

【RTSP從零實踐】2、使用RTP協議封裝并傳輸H264

&#x1f601;博客主頁&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客內容&#x1f911;&#xff1a;&#x1f36d;嵌入式開發、Linux、C語言、C、數據結構、音視頻&#x1f36d; &#x1f923;本文內容&#x1f923;&a…

行業熱點丨手機中框設計如何體現增材思維?

編者薦語&#xff1a; 通過增材設計思維在金屬邊框設計晶格結構&#xff0c;既能減輕重量&#xff0c;同時也有助于散熱&#xff0c;針對不同位置設計不同類型的晶格結構還能起到緩沖效果&#xff0c;提高手機抗沖擊能力。 以下文章來源于Inspire增材創新設計&#xff0c;作者…

鴻蒙案例實戰——添加水印

本示例為開發者展示常用的水印添加能力&#xff0c;包括兩種方式給頁面添加水印、保存圖片添加水印、拍照圖片添加水印和pdf文件添加水印。 案例效果截圖 首頁 頁面水印 圖片水印 pdf水印 案例運用到的知識點 核心知識點 頁面添加水印&#xff1a;封裝Canv…

Qt工作總結07 <qBound和std::clamp>

一、qBound簡介 1. 定義 是 Qt 框架中一個非常實用的邊界限制函數&#xff08;也稱為 "clamp" 函數&#xff09;&#xff0c;用于將一個值限制在指定的最小值和最大值之間。頭文件&#xff1a;#include <QtGlobal> 2. 函數原型 template <typename T>…

53-Oracle sqlhc多版本實操含(23 ai)

SQLHC&#xff08;SQL Health Check&#xff09;作為 Oracle 數據庫性能診斷的核心工具&#xff0c;其設計理念和核心功能在 Oracle 各版本中保持高度一致&#xff0c;但在技術實現和周邊生態上存在漸進式優化。定期對關鍵業務 SQL 執行健康檢查&#xff0c;特別是在版本升級或…

math.pow()和pow()的區別

math.pow() 和 pow() 的區別 ? 1. math.pow() 來自 math 模塊參數&#xff1a;兩個數&#xff08;底數&#xff0c;指數&#xff09;結果類型&#xff1a; 始終返回 float 類型 示例&#xff1a; import math print(math.pow(2, 3)) # 輸出&#xff1a;8.0 &#xff08;…

郵科OEM攝像頭POE供電技術的核心優勢

安防監控中&#xff0c;供電方式影響系統穩定性、安裝效率與維護成本。郵科攝像頭采用POE技術&#xff0c;通過網線同時傳輸數據與電力&#xff0c;革新傳統部署模式。本文解析其六大核心優勢&#xff0c;展現其作為現代安防優選方案的價值。 一、布線簡化&#xff0c;效率提升…

微信小程序-數據加密

npm install crypto-js utils/aes.js const CryptoJS require(crypto-js);// 默認的 KEY 與 iv 如果沒有給 const KEY CryptoJS.enc.Utf8.parse(KrQ4KAYOEyAz66RS); // 十六位十六進制數作為密鑰 const IV CryptoJS.enc.Utf8.parse(ep1YCmxXuxKe4eH1); // 十六位十六進制…

【時時三省】(C語言基礎)善于利用指針

山不在高&#xff0c;有仙則名。水不在深&#xff0c;有龍則靈。 ----CSDN 時時三省 指針是C語言中的一個重要概念&#xff0c;也是C語言的一個重要特色。正確而靈活地運用它&#xff0c;可以使程序簡潔、緊湊、高效。每一個學習和使用C語言的人&#xff0c;都應當深入地學習和…

單點登錄進階:基于芋道(yudao)授權碼模式的單點登錄流程、代碼實現與安全設計

最近遇到需要單點登錄的場景&#xff0c;我使用的是芋道框架&#xff0c;正好它手動實現了OAuth2的功能&#xff0c;可以為單點登錄提供一些幫助&#xff0c;結合授權碼的模式&#xff0c;在改動最小的情況下實現了單點登錄。關鍵業務數據已經隱藏&#xff0c;后續將以以主認證…

關于Seata的一個小issue...

文章目錄 引言原因&#x1f913;解決方法&#x1f635;總結?? 引言 某一天&#xff0c;筆者在逛著Github的時候&#xff0c;突然看到seata有個有趣的issue&#xff0c;是一個task。 相關描述&#xff1a; While running the DruidSQLRecognizerFactoryTest.testIsSqlSynta…

FTTR+軟路由網絡拓撲方案

文章目錄 網絡拓撲軟路由配置FTTR光貓路由器TPLink路由器配置WAN設置LAN設置 參考 網絡拓撲 軟路由配置 配置靜態IP地址&#xff1a;192.168.1.100設置網關指向主路由的IP 設置自定義DNS服務器 開啟DHCP 這一步很關鍵&#xff0c;可以讓連上wifi的所有設備自動趴強。 FTTR光貓…

RPC - 服務注冊與發現模塊

為什么要服務注冊&#xff0c;服務注冊是做什么 服務注冊主要是實現分布式的系統&#xff0c;讓系統更加的健壯&#xff0c;一個節點主機將自己所能提供的服務&#xff0c;在注冊中心進行登記 為什么要服務發現&#xff0c;服務發現是要做什么 rpc調用者需要知道哪個節點主機…

分布式緩存:應對突發流量的緩存體系構建

文章目錄 緩存全景圖Pre背景與目標說明緩存原則與設計思路緩存體系架構緩存預熱與緩存預加載庫存操作與緩存結合防刷、限流與緩存緩存一致性與失效異步落地與消息隊列監控與指標容災與擴展示例小結 緩存全景圖 Pre 分布式緩存&#xff1a;緩存設計三大核心思想 分布式緩存&am…

華為云Flexus+DeepSeek征文|CCE容器高可用部署搭建Dify-LLM平臺部署AI Agent

華為云FlexusDeepSeek征文&#xff5c;CCE容器高可用部署搭建Dify-LLM平臺部署AI Agent 前言 Dify是一款開源的大語言模型應用開發平臺&#xff0c;融合了后端即服務和LLMOps的理念&#xff0c;使開發者可以快速搭建生產級的生成式AI應用&#xff0c;本文將詳細介紹如何使用華…

Postman 的 Jenkins 管理 - 手動構建

目錄 一、準備工作 二、postman 項目腳本準備并導出 1. 打開已完成并測試無誤的 postman 項目腳本。 再次執行測試。 ?編輯2. 導出&#xff08; 測試用例集、環境變量 兩個文件&#xff09;**“不 支 持 中 文”** —— 全部改成英文&#xff01; ?編輯3. 文件所在目錄…

音視頻之H.264/AVC解碼器的原理和實現

系列文章&#xff1a; 1、音視頻之視頻壓縮技術及數字視頻綜述 2、音視頻之視頻壓縮編碼的基本原理 3、音視頻之H.264/AVC編碼器原理 4、音視頻之H.264的句法和語義 5、音視頻之H.264/AVC解碼器的原理和實現 6、音視頻之H.264視頻編碼傳輸及其在移動通信中的應用 7、音視…

【智能安全帽新升級】搭載VTX316TTS語音合成芯片,讓安全“聽得見”!

在工地轟鳴的機械聲中&#xff0c;一句清晰的指令可能比任何文字都更有力量。 當智能安全帽遇上VTX316語音合成芯片&#xff0c;安全防護從“被動響應”進化為“主動交互”&#xff0c;為高危行業戴上了一頂“會說話的智慧大腦”&#xff01; 傳統安全帽的“沉默”危機 在建筑…