目錄
1. Qt的概念和發展
1.1 Qt的概念
1.2 Qt 的發展史:
1.3 Qt 的版本
2. Qt 的優點和應用
2.1 Qt 的優點:
2.2 Qt 的應用場景
2.3 Qt 的應用案例
3. 搭建 Qt 開發環境
3.1 Qt 的開發工具
3.2 Qt SDK 的下載和安裝
3.3 Qt 環境變量配置和使用
4. 輸出HelloQt和對象樹
4.1 輸出HelloQt
4.2 對象樹
4.3 亂碼問題和qDebug
本篇完。
1. Qt的概念和發展
1.1 Qt的概念
Qt 是一個跨平臺的 C++ 圖形用戶界面應用程序框架。
????????它為應用程序開發者提供了建立藝術級圖形界面所需的所有功能。它是完全面向對象的,很容易擴展。Qt 為開發者提供了一種基于組件的開發模式,開發者可以通過簡單的拖拽和組合來實現復雜的應用程序,同時也可以使用 C++ 語言進行高級開發。
????????圖形用戶界面:指采用圖形方式顯示的計算機操作用戶界面,是計算機與其使用者之間的對話接口,是計算機系統的重要組成部分。
如下是 Android 手機圖形用戶界面和?IOS 手機圖形用戶界面:
Android 桌面應用:
IOS 桌面應用:
1.2 Qt 的發展史:
- 1991 年 Qt 最早由奇趣科技開發;。
- 1996 年進?商業領域,它也是目前流行的 Linux 桌面環境 KDE 的基礎。
- 2008 年奇趣科技被諾基亞公司收購,Qt 成為諾基亞旗下的編程工具。
- 2012 年 Qt 又被 Digia 公司收購。
- 2014 年 4 月 跨平臺的集成開發環境 Qt Creator3.1.0 發布,同年 5 月 20 日發布了 Qt 5.3 正式版,至此 Qt 實現了對 IOS、Android、Embedded 等各平臺的全面支持。
1.3 Qt 的版本
???????Qt?目前最新的版本是 Qt 6,但是相對來說 Qt 6 和 Qt 5 之間的核心功能區別不大,并且企業中也仍然有大量的項目在使用 Qt 5。因此本博客后面也仍然使用 Qt 5 版本來進行學習。
另外 Qt 在發布的時候還提供了兩種許可證:
- 商業許可:開發者以商業目的使用 Qt 框架進行開發和發布軟件的許可,開發者需要購買商業許可并按照相關規定使用 Qt 框架。商業許可提供了更多的功能和服務,適合于商業軟件開發。
- 開源許可:開發者以非商業目的使用 Qt 框架進行開發和發布軟件的許可,開發者可以免費使用 Qt 框架,但需要遵守開源許可協議的要求,如在軟件中包含 Qt 許可協議的聲明等。
2. Qt 的優點和應用
2.1 Qt 的優點:
- 跨平臺,幾乎支持所有的平臺。
- 接口簡單,容易上手,學習 QT 框架對學習其他框架有參考意義。
- 一定程度上簡化了內存回收機制(半自動的垃圾回收,能夠簡化內存釋放,也能夠盡可能小的影響程序的運行效率)。
- 開發效率高,能夠快速的構建應用程序。
- 有很好的社區氛圍,市場份額在緩慢上升。
- 可以進行嵌入式開發。
Qt 支持的平臺:
- Windows —— XP、Vista、Win7、Win8、Win2008、Win10 ??
- Unix / X11 —— Linux(主要是給服務器使用,服務器不需要圖形化界面)、Sun Solaris、HP-UX、Compaq Tru64 UNIX、IBM AIX、SGI IRIX、FreeBSD、BSD/OS、和其他很多 X11 平臺
- Macintosh —— Mac OS X
- Embedded —— 有幀緩沖支持的嵌入式 Linux 平臺,Windows CE
- Android
2.2 Qt 的應用場景
????????Qt 能夠創建各種類型的桌面應用程序,包括文件管理器、媒體播放器、繪圖程序等。Qt 應用程序支持多種操作系統,可以運行在 Windows、Linux、MacOS 等桌面操作系統上。
移動應用程序
????????Qt 支持 Android 和 IOS 移動操作系統,為應用程序提供了強大的跨平臺能力。可以使用?Qt 構建各種移動應用程序,例如社交應用、游戲、娛樂等。
嵌入式系統
????????Qt 在嵌入式領域應用非常廣泛,它可以構建面向各種設備的圖形應用程序,在機頂盒、車載娛樂系統、安防監控設備等領域具有廣泛的應用。
????????Qt 是一個強大且廣泛應用于跨平臺軟件開發的框架。它提供了豐富的工具和庫,可用于開發高質量、高效率的圖形用戶界面(GUI)應用程序。并且可以在 Windows、linux、macOS 等多種操作系統上運行。隨著行業的發展,Qt 的重要性也逐漸體現出來。
行業發展方向:
- 物聯網(IoT)和嵌?式系統的發展:在當下的嵌入式和物聯網行業中,Qt 的作用逐漸得到了體現,因為可以用它來開發具有 GUI 界面的嵌入式應用程序,這對于智能家居、汽車以及醫療設備等領域來說,具有非常重要的作用。
- 自動駕駛和智能交通領域:現在很多的汽車都引入了自動駕駛的技術,而 Qt 在其中也有著廣泛的應用,它可以開發車載嵌入式系統和用戶界面程序。隨著未來?動駕駛技術的發展,Qt 在這方面的需求也會不斷地增多。
- 游戲開發:Qt 有一些非常重要的功能模塊,例如 Qt 3D Studio,可以應用于游戲開發。未來游戲行業的持續發展,Qt 在游戲行業的發展將會越來越多。
2.3 Qt 的應用案例
(1)Linux 桌面環境 KDE
Linux?桌面環境中存在好幾套桌面環境:
- GNOME(基于 GTK 創建)
- KDE(基于 Qt 創建)
(2)WPS Office 辦公軟件
(3)Skype 網絡電話
????????Skype 是一款即時通訊軟件,其具備 IM 所需的功能,比如視頻聊天、多人語音會議、多人聊天、傳送文件、文字聊天等功能。它可以高清晰與其他用戶語音對話,也可以撥打國內國際電話,無論固定電話、手機均可直接撥打,并且可以實現呼叫轉移、短信發送等功能。
(4)Google Earth 谷歌地圖
(5)VLC 多媒體播放器
(6)VirtualBox 虛擬機軟件(VirtualBox 號稱是最強的免費虛擬機軟件)
3. 搭建 Qt 開發環境
3.1 Qt 的開發工具
????????Qt 支持多種開發工具,其中比較常用的開發工具有:Qt Creator、Visual Studio、Eclipse。下面壹壹介紹。
Qt Creator
????????Qt Creator 是一個輕量級的跨平臺集成開發環境(IDE),專為使用 Qt 框架進行應用程序開發而設計。它是一個功能強大、易于使用、快速且高效的工具,被廣泛用于編寫各種類型的應用程序,如桌面應用程序、移動應用程序和嵌入式系統等。
????????Qt Creator 提供了一個可視化的界面設計器和代碼編輯器,可以幫助開發者更快捷地創建復雜的用用界面和處理各種事件。它還包含了調試工具、版本控制工具、自動完成和智能提示等功能,以及?持多語言和跨平臺的開發環境。
Qt Creator 的主要特點包括:
- 緊密集成的 Qt 框架:Qt Creator 專門為 Qt 開發而設計,因此它與 Qt 框架集成得非常緊密,使開發者可以更容易地管理和部署他們的應用程序。
- 強大的編輯器:Qt Creator 具有?些先進的編輯器功能,如語法高亮、代碼折疊、智能提示、自動完成和代碼重構。
- 集成的調試器:Qt Creator 內置了調試器,允許開發人員在代碼中設置斷點以及檢查變量、堆棧和調用樹等信息。
- 高效的構建系統:Qt Creator 提供了一個高效的構建系統,可以自動構建和部署應?程序,同時支持使用不同的編譯器和平臺。
- 可視化界面設計器:Qt Creator 具有?個可視化界面設計器,它允許開發人員在沒有編寫代碼的情況下創建復雜的用戶界面。
- 多語言支持:Qt Creator 支持多種編程語?,包括 C++、QML、JavaScript 等。
????????Qt Creator 是一個功能齊全、易于使用且高效的跨平臺?IDE,適用于各種類型的應用程序開發,特別是那些使用?Qt 框架的開發者。
Visual Studio
????????Visual Studio 是由微軟公司開發的集成開發環境(IDE)。它可以用來開發多種類型的應用程序。包括 Windows 桌面應用程序、Web 應用程序、移動應用程序、游戲等。Visual Studio 提供了豐富的開發工具和功能,包括代碼編輯器、調試器、自動完成、代碼重構、版本控制等等。它支持多種編程語言,如:C++、C#、Visual Basic、F#、Python等。Visual Studio 還可以與其他開發工具和服務集成,如 Azure 云服務、GitHub、Jenkins 等。
Visual Studio 具有以下?些主要特點:
- 多語言支持:Visual Studio 支持多種編程語言,包括 C++、C#、Visual Basic、F#、Python、JavaScript 等。
- 豐富的工具集:VS 提供了各種開發工具,包括代碼編輯器、調試器、代碼分析工具等,以提高開發人員的效率。
- 可視化設計:VS 提供了可視化的設計工具,如窗體設計器、WPF 設計器等,使開發人員可以直觀地設計用戶界面。
- 跨平臺開發:VS 支持跨平臺開發,可以開發適用于 Windows、Linux 和 MacOS 等多個平臺的應用程序;
- 集成的調試器:VS 集成了強大的調試器,可以進行代碼的單步調試、斷點調試等操作來幫助開發人員查找和修復錯誤。
- 豐富的擴展性:VS 可以通過安裝擴展來擴展其功能,開發人員可以根據自己的需求選擇并安裝適合的擴展。
Eclipse
????????Eclipse 是著名的跨平臺的自由集成開發環境(IDE)。最初主要用來 Java 語言開發,但是目前亦有人通過插件使其作為其他計算機語言比如 C++ 和 Python 的開發工具。Eclipse 的本身只是一個框架平臺,但是眾多插件的支持使得 Eclipse 擁有其他功能相對固定的 IDE 軟件很難具有的靈活性。許多軟件開發商以 Eclipse 為框架開發自己的 IDE。Qt 框架可以與 Eclipse 集成,使開發者可以使用 Eclipse 的強大功能來開發 Qt 應用程序。
3.2 Qt SDK 的下載和安裝
Qt SDK 的下載
Qt 下載官網:Index of /archive/qt
國內清華源:Index of /qt/archive/qt/ | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror
進入官網,按如下圖示進行相應的系統版本下載即可。
打開官網鏈接
選擇需要下載的版本(我以 5.14 版本為例)
????????現在點擊之后是會出現 "Download from your IP address is not allowed",是因為 Qt5 離線安裝包目前在國內已經被墻了,下載不了,只能下載在線安裝包,直接訪問就會顯示上面的提示。(可以去網上找找資源)
選擇需要下載的版本
所選具體版本為:5.14.2
選擇 Windows 桌面應用程序
安裝注意事項:
????????選擇安裝路徑時不能出現中文路徑,否則即使安裝上也無法正常使用。如果不想注冊賬號,那就在在雙擊之前先斷網,否則需要注冊 Qt 賬號登錄后才能進入下一步安裝。
以下是本人安裝的選項:
3.3 Qt 環境變量配置和使用
(1)找到 Qt 的安裝路徑,復制 "bin" 路徑
本人是D:\Qt\Qt5.14.2\5.14.2\mingw73_64\bin
(2)"此電腦" ——> 鼠標右鍵, "屬性" ——> "高級系統設置" ——> "環境變量",在系統變量找到Path后雙擊,復制此條路徑到里面后確定即可:
使用驗證:
????????對于Qt開發來說,使用的一個開發的環境是Qt Creator,那對于這個環境來說,下面講述一下基本的使用方式和對應的選項意義。
首先是創建一個項目,直接進行新建即可。
????????那對于新建之后的選項,就有不同的類型了,這里由于是初學,所以只選擇一個基礎的選擇,如果想要用Qt去完成一個GUI程序,那么就要選擇第一個選項,對于下面的選項也進行注釋和備注:
選擇代碼路徑后接著會有下面的界面
那么這個里面包含的這三項是什么呢?
這是一個構建系統,通過Qt寫的程序,會涉及到一系列的元編程技術,也就是說用代碼來生成代碼
????????那Qt框架在進行編譯的時候,會自動調用一系列的生成工具,基于用戶本身寫的代碼,生成一系列的其他的C++的代碼,最終進行編譯的代碼,其中也包含了這些最后生成的這些代碼,這就是構建系統
????????那在上面的這三種中,其中qmake是一個老牌的Qt構建工具,而CMake并非是Qt的專屬構建工具,許多開源項目中都會用到CMake,而最后的Qbs是一個新一代的構建工具,但是對于現在來說,使用的場景比較少
再下一個是這一步:
????????上圖所示的是,當使用Qt Creator創建項目,會自動的生成一些代碼,而此時這個生成的代碼中就會包含一個基本的列,而在這個界面選項中要選擇的就是一個自動生成的類的父類是什么。
- QMainWindows:這個類可以生成一個完整的應用程序窗口,包含有菜單欄,工具欄,狀態欄等。
- QWidget:這個類表示一個控件,也就是窗口上的一個具體的元素,例如有輸入框,按鈕,下拉框,單選按鈕,復選按鈕等等。
- QDialog:這個類表示的是一個對話框。
這里先選QWidget。
在Qt頁面中,內置的類都是用Q前綴開頭來表示的
關于form file:
????????這個form file在Qt框架中扮演者非常重要的角色,Qt中創建圖形化界面的程序主要有以下兩種方式:
- 直接通過C++代碼的方式進行創建界面。
- 通過form file,用圖形化的方式來生成界面,此時就可以通過這個Qt Designer或者直接使用Qt Creator來編輯這個ui文件,從而用圖形化的方式快速的方便的創建出這個圖形界面
再之后一直下一步就是關于基于哪個編譯器進行構建后續代碼。
4. 輸出HelloQt和對象樹
以下僅為簡單輸出演示,下一篇博客還有其他輸出方式。
4.1 輸出HelloQt
創建一個項目,初步使用一下QT框架:
添加下面代碼:
點擊左下角運行按鈕:
也可以雙擊:"widget.ui" 文件
拖拽控件至?ui 界面窗口并修改內容
圖形化的界面編輯器:
Qt 窗口坐標體系:
坐標體系:以左上角為原點(0,0),X 向右增加,Y 向下增加。
????????對于嵌套窗口,其坐標是相對于父窗口來說的。示例:使用 Qt 中的坐標系設置控件的位置:分別對 “按鈕” 和 widget 本身移動位置:
運行結果如下圖示:
4.2 對象樹
???????運行出了一個標簽,上面打印的是我們想要的內容,那么這也就意味著初步實現了目的,但是是否有這樣的問題: new的對象,難道不會導致內存泄漏嗎? 事實上,這個問題是存在的,但是在QT框架中已經解決了這個問題,具體的解決措施就是對象樹。
#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QLabel>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QLabel* label = new QLabel(this);label->setText("HelloQt");
}MainWindow::~MainWindow()
{delete ui;
}
????????解決的方式就是,new的時候把this傳遞進去了,也就是說是把整個對象的生命周期統一交給了這個QT對象樹來進行管理,所以在這個代碼中,QT的控制下是不會造成內存泄漏的,label對象會在合適的時候進行析構,因為這個對象已經在對象樹上了
那么什么是對象樹呢?
????????在前端開發當中,也會有這樣的對象樹的概念,DOM本質上就是一個樹形結構,也就是所謂的N叉樹,通過樹形結構把界面上的元素組織起來,而在QT中也是這樣的道理,具體的可以用下面的圖來進行表示。
所以下一步,我們就創建對應的實驗過程來驗證析構的過程:
選中工程程名,鼠標右鍵 ——> "add new..."(或 “添加新文件”):
此時手動創建類的頭文件以及源文件會自動添加到目標工程中:
// mylabel.h
#ifndef MYLABEL_H
#define MYLABEL_H#include <QLabel>class MyLabel : public QLabel
{
public:MyLabel(QWidget* parent);~MyLabel();
};#endif // MYLABEL_H
// mylabel.cpp
#include "mylabel.h"
#include <iostream>MyLabel::MyLabel(QWidget* parent) : QLabel(parent)
{}MyLabel::~MyLabel()
{std::cout << "MyLabel 析構" << std::endl;
}
主程序換成mylabel:
點擊運行后關閉HelloQt界面:
雖然出現了亂碼,但析構函數還是自己被調用了。
????????對象樹確保的是先釋放子節點的內存,后釋放父節點的內存。而析構函數的調用順序則不一定遵守上述要求,因此看到子節點的析構執行順序反而在父節點析構順序之后。
注意:調用析構函數和釋放內存并非是同一件事情。
4.3 亂碼問題和qDebug
可以看到,上面的結果出現了亂碼(編碼方式不匹配)。
在計算機中,一個漢字占幾個字節?
????????針對這個問題,不能回答出一個具體的數字。需要有提前條件:當前中文編碼使用的是哪種方式(字符集)。
????????計算機存的是二進制數字。英文字母是用 ASCII 碼表表示的,規定了每個字符都有一個對應的數字來表示。
????????只是表示英文,一個字節就足夠了,畢竟英文字母數目非常有限。日常的常用漢字大概是 4k 多個,算上各自生僻字,總數差不多是 6w 左右。因為表示漢字的字符集有很多種,不同的字符集表示同一個漢字,可能使用的數字并不相同。
目前,表示漢字字符集主要是以下兩種方式
- GBK(中國大陸),使用 2 個字節表示一個漢字。Windows 簡體中文版默認的字符集就是 BGK。
- UTF-8 / utf8,變長編碼,表示一個符號,使用的字節數有變化(2-4),但是一般一個漢字是 3 個字節。Linux 中默認的字符集是 utf8。
????????Qt Creator 內置的終端不是 utf8 的方式來顯示字符串,且這個終端好像不能設置字符編碼。Qt 中有一個 QString,可以幫助我們自動處理編碼方式,且還提供了專門用來打印日志的工具 qDebug(),也能很好的自動處理編碼方式。
qDebug 這個宏里封裝了 QDebug 對象,可以直接使用qDebug(),可以被當作 cout 來使用。
本篇完。
下一篇是Qt開發②Qt Creator的詳細介紹和使用。