Qt基礎入門-詳解

?前言
qt之路正式開啟

💓 個人主頁:普通young man-CSDN博客

? 文章專欄:C++_普通young man的博客-CSDN博客

? 本人giee: ? 普通小青年 (pu-tong-young-man) - Gitee.com

? ? ? 若有問題 評論區見📝

🎉歡迎大家點贊👍收藏?文章
————————————————


目錄

Qt 框架詳解

Qt 是什么

發展歷程

支持平臺與版本

優點

發展前景

成果

搭建 Qt 開發環境

開發工具介紹

Qt SDK 下載與安裝

安裝SDK

環境變量配置

為什么要設置環境變量

環境變量是什么

以 path 環境變量為例

設置 Qt 環境變量的目的

深入了解 Qt Creator

界面概覽

Qt Creator 新建項目+創建文件+界面介紹

Qt HelloWorld程序

用label控件打印

????????可視化操作實現

????????純代碼方式

下面我對這個代碼進行一個詳細的讀:?編輯

利用push_button來實現helloworld

?????????可視化操作實現

? ? ? ? 純代碼方式

項目文件解析

.pro?文件的作用

widget.h?文件的作用

main.cpp?文件的作用

widget.cpp?文件的作用

widget.ui

XML 與 HTML 的主要區別

Qt Creator 快捷鍵表

查閱文檔

對象樹

?編輯

1. QObject 的對象樹

2. QWidget 的繼承關系

3. 內存管理的優勢

代碼舉例

字符編碼解析:避免亂碼

坐標


Qt 框架詳解

Qt 是什么

Qt 是跨平臺的 C++ 圖形用戶界面應用程序框架,為開發者提供構建優質圖形界面的全套功能。它完全面向對象,易于擴展,支持組件式開發模式,開發者既能通過拖拽組合快速搭建應用,也能用 C++ 進行深度開發。圖形用戶界面作為人與計算機交互的關鍵接口,在各類設備中至關重要,而 Qt 正是打造這些界面的得力工具12。

發展歷程

Qt 的發展歷程豐富多樣,1991 年由奇趣科技創立1996 年進入商業領域成為 Linux 桌面環境 KDE 的基石。此后,歷經諾基亞、Digia 公司收購,不斷演進。2014 年,Qt Creator 3.1.0 和 Qt 5.3 正式版發布,標志著 Qt 全面支持 iOS、Android 等多平臺,功能更加完善

支持平臺與版本

Qt 支持的平臺廣泛,涵蓋 Windows、Unix/X11、Macintosh、Embedded 以及 Android 等。目前最新版本是 Qt 6,但考慮到企業中大量項目仍在使用 Qt 5,且兩者核心功能差異不大,學習時選用 Qt 5 更具實用性。Qt 發布時提供商業許可和開源許可,開發者可按需選擇

優點

  1. 跨平臺特性顯著,能適配幾乎所有主流平臺。
  2. 接口設計簡潔,易于上手,并且對學習其他框架具有借鑒意義。
  3. 簡化了內存回收機制,開發效率高,可快速構建應用程序。
  4. 社區活躍,市場份額穩步上升,同時還支持嵌入式開發

發展前景

隨著物聯網、自動駕駛、游戲開發等行業的蓬勃發展,Qt 的重要性日益凸顯。在物聯網和嵌入式系統中,Qt 可開發帶 GUI 的嵌入式應用,用于智能家居、汽車、醫療設備等領域;自動駕駛和智能交通領域,Qt 能開發車載嵌入式系統和用戶界面程序;游戲開發方面,Qt 的 Qt 3D Studio 等功能模塊大有用武之地。從就業角度看,Qt 開發人員需求持續增長,就業機會多、薪資可觀、職業發展前景良好

成果

Linux桌面環境KDE

WPS Office

Google Earth

VLC 播放器

VirtualBox虛擬機軟件(VirtualBox號稱是最強的免費虛擬機軟件)


搭建 Qt 開發環境

開發工具介紹

Qt 開發工具多樣,常用的有 Qt Creator、Visual Studio 和 Eclipse。Qt Creator 專為 Qt 開發設計,是輕量級跨平臺集成開發環境(IDE),集成了可視化界面設計器、代碼編輯器、調試工具等,功能強大且易用,后續學習將以它為主。Visual Studio 由微軟開發,可開發多種類型應用,支持多種編程語言,功能豐富。Eclipse 是跨平臺自由 IDE,最初用于 Java 開發,通過插件也能用于 Qt 開發

Qt SDK 下載與安裝

Qt SDK 可從官方網站(Index of /archive/qt)或國內清華源(Index of /qt/archive/qt/ | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror?)下載。以 5.14 版本為例,下載時需按步驟選擇版本、操作系統對應的安裝文件。安裝過程中,要注意斷網安裝可跳過注冊登錄步驟;安裝路徑不能含中文;根據磁盤空間選擇安裝組件,若空間充足建議全選。安裝完成后,可通過運行示例程序驗證安裝是否成功

安裝SDK

環境變量配置

配置 Qt 環境變量是為了在命令行或其他應用中能直接訪問 Qt 相關命令和工具。找到 Qt 安裝路徑下的 “bin” 目錄,將其添加到系統環境變量中。具體操作是在 “此電腦” 右鍵選擇 “屬性”,進入 “高級系統設置” 的 “環境變量” 進行添加

為什么要設置環境變量

環境變量是什么

環境變量就像是城市里一些特殊的索引標記。在計算機這個 “城市” 里,應用程序運行的時候常常需要一些特定的信息,這些信息就放在環境變量里。好比店鋪可能需要知道附近倉庫的位置,這個位置信息就可以看作是環境變量里的內容。

以 path 環境變量為例

就拿 Windows 和 DOS 系統里的 path 環境變量來說吧。當你要在這個 “城市” 里找一家特定的 “店鋪”(也就是運行一個程序),但又沒告訴計算機具體位置(沒給完整路徑)時,計算機不會只在你當前站的地方(當前目錄)找,它還會去 path 這個 “地圖索引” 里標記的地方找。比如說,path 里標記了好幾個街區,計算機就會去這些街區挨個找你要的 “店鋪”。

設置 Qt 環境變量的目的

在 Windows 系統上設置 Qt 的環境變量,就相當于在城市的 “地圖索引” 里專門標記出 Qt 相關 “店鋪”(命令和工具)的位置。這樣一來,不管你是在街道上(命令行)溜達,還是在其他大樓(其他應用程序)里,都能快速找到這些 Qt 的 “店鋪”,直接去使用里面的東西,不用每次都費勁去記具體位置再去找啦。


深入了解 Qt Creator

界面概覽

類別詳情
菜單欄1. 文件:新建、打開、關閉項目和文件、打印、退出等基本功能
2. 編輯:撤銷、剪切、復制、查找、選擇編碼等功能
3. 構建:構建和運行項目等相關功能
4. 調試:調試運行項目等相關功能
5. Analyze:QML 分析器、Valgrind 內存和功能分析器等相關功能
6. 工具:快速定位菜單、外部工具菜單等,包含環境、文本編輯器、幫助、構建和運行、調試器、版本控制等設置選項
7. 控件:設置窗口布局的菜單,如全屏顯示、隱藏邊欄功能等
8. 幫助:Qt 幫助、Qt Creator 版本信息、報告 bug、插件管理等菜單
模式選擇1. 歡迎模式:功能快捷入口(打開幫助教程、示例程序、項目,新建項目,快速打開以前項目和會話,聯網查看 Qt 官方論壇和博客等),示例頁面有大量示例程序及搜索欄,教程頁面有英文視頻教程資源
2. 編輯模式:查看和編輯程序代碼、管理項目文件,編輯器有關鍵字特殊顏色顯示、代碼自動補全、聲明定義快捷切換、函數原型提示、F1 鍵快速打開相關幫助、全項目查找等功能,可在 “工具→選項” 設置編輯器
3. 設計模式:整合 Qt Designer 功能,可設計圖形界面,進行部件屬性、信號和槽、布局設置等操作
4. 調試模式:支持設置斷點、單步調試、遠程調試等功能,有局部變量和監視器、斷點、線程、快照等查看窗口
5. 項目模式:包含特定項目的構建設置(項目版本、Qt 版本、編譯步驟)、運行設置、編輯器設置(文件默認編碼)、代碼風格設置、依賴關系等頁面
6. 幫助模式:整合 Qt 助手,有目錄、索引、查找、書簽等導航模式,可查看 Qt 和 Qt Creator 各方面信息
構建套件選擇器1. 目標選擇器:選擇構建項目、使用的 Qt 庫,適用于多個 Qt 庫的項目,可選擇編譯項目的 debug 或 release 版本
2. 運行按鈕:實現項目的構建和運行
3. 調試按鈕:實現項目的調試
4. 構建按鈕:完成項目的構建
歡迎模式下的窗口工作方式1. Project:新建工程、打開工程
2. 示例:Qt 官方的一些示例
3. 教程:Qt 官方教程
定位器快速定位項目、文件、類、方法、幫助文檔、文件系統,可使用過濾器準確定位查找結果
輸出窗格1. 問題:顯示程序編譯時的錯誤和警告信息(快捷鍵 Alt+1)
2. Search Results:顯示執行搜索操作后的結果信息(快捷鍵 Alt+2)
3. 應用程序輸出:顯示應用程序運行過程中輸出的所有信息(快捷鍵 Alt+3)
4. 編譯輸出:顯示程序編譯過程輸出的相關信息(快捷鍵 Alt+4)
5. Debugger Console:調試器控制臺相關輸出(快捷鍵 Alt+5)
6. 概要信息:顯示相關概要內容(快捷鍵 Alt+6)
7. 測試結果(Test Results):展示測試結果信息(快捷鍵 Alt+7)
會話記錄可對會話進行管理(包括 Clone),未打開工程時顯示最后一次打開的(會話)工程,已打開則顯示當前的會話(工程)
新建項目可進行項目的新建操作
打開已有項目用于打開已存在的項目

Qt Creator 新建項目+創建文件+界面介紹

新建項目對話框里有五類項目模板:

ApplicationQt 應用程序,涵蓋普通窗體程序和 QtQuick 程序
Library能夠創建動態庫、靜態庫,以及 QtQuick 擴展插件、QtCreator 自身插件
其他項目可創建單元測試項目、Qt4 設計師自定義控件、子目錄項目等
Non-Qt-Project非 Qt 項目,可創建純 C 或純 C++ 項目
Import Project導入項目,用于從版本控制系統管理的軟件項目中導入舊的項目

常用的只有第?類 Application,選擇它,在右側會看到 Qt應?程序的五個子模板:

Qt Widgets Application普通窗體模板,屬于傳統基于部件的窗體界面程序
Qt Console ApplicationQt 控制臺應用程序,由于 Qt 主要用于圖形界面設計,該控制臺項目模板基本不使用
Qt for Python在 Python 下以 LGPL 的許可來開發閉源 Qt 軟件
Qt Quick ApplicationQt 提供的一種高級用戶界面技術,便于快速為移動以及嵌入式設備開發流暢美觀的用戶界面。Qt Quick 模塊是開發 QML 應用的標準庫,涵蓋可視化、交互、動畫、模型、視圖、粒子效果以及著色效果等創建用戶界面所需的一切

后續操作:

構建工具簡介特點相關文件 / 系統與 Qt 關系
qmake是一個構建工具,用于自動生成 makefile 文件支持跨平臺構建編輯后綴名為.pro 的文件Qt 自帶的構建工具
CMake是一個跨平臺的構建工具,本身不是編譯器,是生成讓編譯器能讀懂編譯流程文件的工具能自動生成構建系統,如 Makefile 和 Visual Studio 項目文件生成相關構建系統文件第三方工具,有自己的文檔
Qbs(Qt Build Suite:Qt 構建套件)同 qmake、CMake 一樣是構建工具號稱是新一代的構建工具,比 qmake 編譯速度更快,從項目文件的高級項目描述中生成正確的依賴表無特定文件類型描述,生成依賴表沒有綁定 Qt 版本,可獨立使用

基類說明
QMainWindow主窗口類,用于復雜應用程序,包含中央客戶區、菜單欄、工具欄、狀態欄及多個可停靠工具對話框
QWidget最基礎的窗體類,可放置多個控件實現功能,適合簡單界面程序
QDialog基于對話框的程序,支持模態顯示和返回值,常用于彈窗或主界面(繼承自 QWidget)

選擇的語言是"漢語","英語"這樣的語言.而不是"編程語?"

默認情況下,系統僅提供第一個 “Desktop Qt 5.14.2 MinGW 64-bit” 選項。若用戶安裝并配置了多個 Qt 套件,在相應操作中則可將所有套件納入選擇范圍。

Qt 套件是一套完整的集合,涵蓋了 Qt 程序從編譯鏈接直至運行環境所需的全部工具,以及 Qt 類庫。以 MinGW 版本的 Qt 程序為例,在生成與調試過程中,至少需要以下組件:MinGW 中的編譯器 g++(其會自動調用鏈接器)、與 g++ 相配套的基礎庫、調試器 gdb,還有利用 MinGW 環境編譯而成的 Qt 類庫本身。通常建議在 “Kit Selection” 中,將所有可用套件全部選中,以確保程序開發與運行的全面支持。

序號窗口名稱詳情
組件選擇窗口分為多個組,如 Layouts、Buttons、Display Widgets 等,可找到界面設計的常見組件
UI 設計窗口從組件選擇窗口拖放組件到該窗口的窗體上,實現組件放置
動作編輯窗口包含 Action Editor 和 Signals 及 Slots 編輯器。Action Editor 用于新建 Action 并添加到菜單欄和工具欄;Signals 和 Slots 編輯器用于可視化關聯信號與槽
對象瀏覽窗口以樹狀視圖展示窗體上各組件的布局包含關系,視圖有兩列,分別顯示組件的對象名稱(ObjectName)和類名稱
屬性設置窗口顯示選中組件或窗體的各種屬性及其取值,可在窗口中修改屬性值

模式說明
Debug以 “-g” 模式編譯,編譯時帶有符號信息,其優點是便于程序調試
Profile處于 “Debug” 和 “Release” 之間的一種模式,兼顧性能和調試,可近似看作是性能更優且方便調試的版本
Release經過優化處理,在性能方面相比 “Debug” 模式更上一個檔次

Qt HelloWorld程序

用label控件打印

????????可視化操作實現

這個操作很簡單:

這就是利用圖形界面進行打印helloworld

????????純代碼方式

這里為什么不直接構造對象?而是要new一個,這是因為直接構造他是創建到棧中,而new是創建到堆中,QT建議用new一個對象的方式
其實這也與他們的生命周期不同,創建到棧上離開特定的作用域就銷毀了,但是如果創建到堆中生命周期一直到程序結束析構或則delete,這也去確保了qt中信號槽機制一直保持有效

下面我對這個代碼進行一個詳細的讀:

這邊你輸入QLabel的時候會出現兩個文件,一個沒有.h,一個有.h,這個qlabel.h是一個qt的一個上古文件,如果學習c++的都知道什么是向前兼容,后面c++98更新后到c++11,然后命名方式就變成不要.h后綴,其實也就是在上面封裝了一層,但是這里的標準肯定和遠古文件的文件是不一樣的


setText的參數是QString,這是由于c++中的string不要用,而且經常被罵,然后又不進行優化,所以qt就專門自己搞了一個QString,和String的用法插不多,除了QString,還有很多容器,qt都自己弄了一套輪子


利用push_button來實現helloworld

?????????可視化操作實現

對這個控件玩一些qt中的信號槽機制,這里我就不用圖形化界面,來演示這個幸信號槽機制,直接上代碼:

? ? ? ? 純代碼方式

純代碼方式直接通過new來創建對象

大家自己悟,我就不說太多了


項目文件解析

在Qt開發環境中,.pro文件扮演著非常重要的角色。它是項目文件(Project File),由qmake工具自動生成,主要用于生成Makefile文件。Makefile文件是編譯系統用來編譯和鏈接代碼的腳本。下面是對.pro文件的一些關鍵點進行整理:

.pro?文件的作用

  • 配置項目.pro文件包含了項目的配置信息,如源文件、頭文件、資源文件的位置,以及需要包含的庫和編譯選項等。
  • 生成Makefile:通過解析.pro文件,qmake可以生成適用于不同平臺的Makefile文件,從而簡化了跨平臺開發的復雜性。
  • 支持多種平臺:由于.pro文件是與平臺無關的,因此可以在不同的操作系統上使用相同的項目文件,只需要調整少量的配置即可。
# 定義項目模板為應用程序
TEMPLATE = app# 指定源文件
SOURCES += main.cpp \otherfile.cpp# 指定頭文件
HEADERS += otherfile.h# 添加資源文件
RESOURCES += application.qrc# 設置額外的包含路徑
INCLUDEPATH += /path/to/include# 鏈接外部庫
LIBS += -L/path/to/lib -llibname# 設置編譯器標志
QMAKE_CXXFLAGS += -Wall -O2

比如那剛才的helloworld舉例:


widget.h?文件的作用

  • 類聲明:定義了一個繼承自?QWidget?或其子類的自定義類。
  • 信號與槽機制:通過?Q_OBJECT?宏啟用信號與槽機制,支持事件處理。
  • UI 組件訪問:使用?Ui::Widget?命名空間中的?Widget?類來訪問通過 Qt Designer 設計的界面組件。
//防止重復包含頭文件
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>// 引入生成的 UI 頭文件
#include "ui_widget.h"class Widget : public QWidget
{Q_OBJECT  // 必須包含此宏以支持信號與槽機制public:explicit Widget(QWidget *parent = nullptr);  // 構造函數~Widget();  // 析構函數private slots:// 這里可以聲明槽函數,用于響應信號void on_pushButton_clicked();  // 示例槽函數private:Ui::Widget *ui;  // 指向生成的 UI 類實例,用于訪問界面上的組件
};#endif // WIDGET_H
部分描述
防止重復包含使用預處理器指令?#ifndef,?#define, 和?#endif?來防止頭文件被多次包含,確保編譯器不會重復處理相同的代碼。
包含必要的頭文件
-?#include <QWidget>引入 Qt 的基礎窗口部件類。
-?#include "ui_widget.h"引入由 Qt Designer 自動生成的 UI 頭文件,其中包含了所有設計好的界面組件的聲明。
Q_OBJECT 宏在類聲明中必須包含?Q_OBJECT?宏,以啟用信號與槽機制。這個宏允許類使用?signals?和?slots?關鍵字,并且讓 qmake 工具能夠識別并生成必要的元對象代碼。
構造函數和析構函數
-?explicit Widget(QWidget *parent = nullptr);構造函數,接受一個可選的父對象指針,默認為?nullptr
-?~Widget();析構函數,用于釋放資源。
私有槽函數在?private slots:?部分聲明槽函數,這些函數將響應特定的信號。例如,void on_pushButton_clicked();?是一個示例槽函數,它會在按鈕點擊時被調用。
UI 組件訪問指針Ui::Widget *ui;:這是一個指向由 Qt Designer 生成的?Ui::Widget?類實例的指針。通過這個指針,你可以訪問界面上的所有組件。例如,如果你有一個按鈕?pushButton,可以通過?ui->pushButton?來訪問它。

main.cpp?文件的作用

  • 應用程序初始化:創建一個?QApplication?對象,它是所有 Qt 應用程序的基礎,負責管理事件循環、應用程序級別的設置等。
  • 主窗口或小部件的創建與顯示:實例化并顯示自定義的小部件(如?Widget)。
  • 事件循環啟動:調用?QApplication::exec()?啟動應用程序的主事件循環,等待用戶交互。
#include "widget.h"  // 包含自定義小部件的頭文件
#include <QApplication>  // 包含 QApplication 類的頭文件int main(int argc, char *argv[])
{QApplication a(argc, argv);  // 創建 QApplication 對象,argc 和 argv 是命令行參數Widget w;  // 創建自定義小部件對象w.show();  // 顯示小部件return a.exec();  // 進入應用程序的主事件循環
}
  1. 包含必要的頭文件

    • #include "widget.h":引入自定義的小部件類聲明。
    • #include <QApplication>:引入 Qt 的?QApplication?類,用于管理應用程序的全局設置和事件循環。
  2. main 函數

    • int main(int argc, char *argv[]):這是 C++ 程序的入口函數,argc?和?argv?分別是命令行參數的數量和值列表。
  3. 創建 QApplication 對象

    • QApplication a(argc, argv);:創建一個?QApplication?對象,它管理應用程序的資源和事件循環。每個 Qt 應用程序必須且只能有一個?QApplication?實例。
  4. 創建并顯示自定義小部件

    • Widget w;:創建自定義的小部件對象(假設你的小部件類名為?Widget)。
    • w.show();:調用?show()?方法顯示小部件。如果沒有這一步,小部件不會出現在屏幕上。
  5. 進入事件循環

    • return a.exec();:調用?QApplication::exec()?方法進入應用程序的主事件循環。這個方法會阻塞直到應用程序退出(例如,用戶關閉了所有窗口)。返回值是應用程序的退出代碼。

widget.cpp?文件的作用

  • 實現類的成員函數:提供在頭文件中聲明的成員函數的具體實現。
  • 設置 UI 組件:初始化用戶界面組件,并將信號與槽進行連接。
  • 處理業務邏輯:實現應用程序的核心功能,如響應用戶交互、數據處理等。
#include "widget.h"
#include <QMessageBox>  // 如果需要使用消息框// 構造函數實現
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);  // 設置 UI 組件// 連接信號與槽connect(ui->pushButton, &QPushButton::clicked, this, &Widget::on_pushButton_clicked);
}// 析構函數實現
Widget::~Widget()
{delete ui;  // 釋放 UI 組件
}// 槽函數實現
void Widget::on_pushButton_clicked()
{QMessageBox::information(this, tr("提示"), tr("按鈕被點擊了!"));
}
  1. 包含必要的頭文件

    • #include "widget.h":引入自定義小部件類的聲明。
    • #include <QMessageBox>:如果需要使用 Qt 提供的消息框,需引入相應的頭文件。
  2. 構造函數實現

    • Widget::Widget(QWidget *parent):構造函數的實現,接受一個可選的父對象指針,默認為?nullptr
    • ui(new Ui::Widget):初始化?ui?成員變量,指向由 Qt Designer 自動生成的 UI 類實例。
    • ui->setupUi(this):調用?setupUi()?方法來設置 UI 組件,確保設計好的界面能夠在程序運行時正確顯示。
  3. 析構函數實現

    • Widget::~Widget():析構函數的實現,用于釋放資源。
    • delete ui:釋放?ui?成員變量所占用的內存。
  4. 信號與槽的連接

    • 使用?connect()?函數將信號與槽進行連接。例如,將按鈕點擊信號?QPushButton::clicked?與槽函數?on_pushButton_clicked?進行連接。
    • 示例中的槽函數會在按鈕點擊時彈出一個信息框。
  5. 槽函數實現

    • void Widget::on_pushButton_clicked():槽函數的實現,具體處理按鈕點擊事件。
    • QMessageBox::information():顯示一個信息框,通知用戶按鈕已被點擊。


widget.ui

這個我就不做過多解釋,只是解釋一下htmlxml:

XML 與 HTML 的主要區別

特性XMLHTML
用途存儲和傳輸數據創建和展示網頁內容
標簽用戶自定義標簽固定的預定義標簽
語法嚴格性必須正確閉合標簽,遵循嚴格的語法規則標簽不閉合也可以正常顯示,語法規則較寬松
顯示導向不直接涉及內容的顯示直接控制內容的布局和顯示
錯誤處理對錯誤敏感,解析器遇到錯誤會停止解析瀏覽器通常會嘗試糾正錯誤并繼續解析
數據模型樹狀結構,適合表示復雜的數據關系線性結構,主要用于文本和多媒體內容展示
  • XML?XML 是一種用于存儲和傳輸數據的標記語言。它被設計成一種靈活的語言,允許用戶定義自己的標簽來描述數據結構。
  • HTML?是一種用于創建網頁的標準標記語言。它定義了網頁的結構和內容,并通過瀏覽器呈現給用戶。

最后給大家展示這些文件的一個關聯圖:

當我們創建一個對象控件,他會有一個objectname

這個name會純在與一個.h文件中,也就是我們主程序的聲明文件,在這個項目文件中的上一級別目錄:


Qt Creator 快捷鍵表

功能快捷鍵描述
注釋/取消注釋Ctrl + /快速注釋或取消注釋選中的代碼行或當前行。
運行項目Ctrl + R編譯并運行當前項目。
編譯項目Ctrl + B僅編譯當前項目,不運行。
字體縮放Ctrl + 鼠標滑輪使用鼠標滑輪調整編輯器中的字體大小。
查找Ctrl + F在當前文件中查找指定的文本。
整行移動Ctrl + Shift + ↑/↓向上或向下移動當前選中的行或光標所在的行。
幫助文檔F1顯示當前光標所在位置的相關幫助文檔。
自動對齊Ctrl + I自動格式化當前文件中的代碼,使其符合代碼風格規范。
切換頭文件和源文件F4在同名的?.h?和?.cpp?文件之間快速切換。
生成函數聲明的定義Alt + Enter在頭文件中聲明函數后,使用此快捷鍵在對應的源文件中自動生成函數定義。

查閱文檔

這里做一個提醒:
大家不要看中文文檔,養成一個閱讀英文文檔的一個習慣,因為不是什么都會有教程的


對象樹

對象樹其實就是一顆N插樹

1. QObject 的對象樹
  • parent 指針的作用
    每個 QObject 對象在創建時可以指定一個父對象(parent 指針),該對象會自動添加到父對象的children()列表中。
  • 內存管理
    當父對象被析構時,其所有子對象也會被自動析構。這確保了子對象的生命周期與父對象綁定,避免內存泄漏。
    • 示例:若按鈕(Button)的父對象是對話框(Dialog),當對話框關閉時,按鈕會自動銷毀。
  • 關鍵特性
    • 父對象并非繼承意義上的父類,而是對象樹中的層級關系。
    • 子對象可通過parent()方法訪問父對象,父對象可通過children()方法獲取所有子對象。

2. QWidget 的繼承關系
  • QWidget 的特性
    QWidget 是所有可見 UI 組件的基類,繼承自 QObject,因此也繼承了對象樹機制。
    • 子組件的顯示:子組件會顯示在父組件的坐標系統內,并被父組件的邊界剪裁。
    • 自動布局調整:當父組件大小變化時,子組件會根據布局規則自動調整位置和大小。
  • 典型應用場景
    • 對話框(QDialog)中的按鈕(QPushButton)作為子組件,隨對話框銷毀而銷毀。
    • 工具欄(QToolBar)作為主窗口(QMainWindow)的子組件,刪除工具欄時主窗口會自動更新布局。

3. 內存管理的優勢
  • 自動內存回收
    • 父對象析構時,遞歸銷毀所有子對象。
    • 手動刪除子對象時,會自動從父對象的children()列表中移除。
  • 避免重復刪除
    Qt 確保每個 QObject 對象僅被刪除一次,由析構順序保證。
核心概念說明
parent 指針定義對象樹層級關系,父對象析構時自動銷毀子對象,簡化內存管理。
QObject 樹所有 QObject 對象通過 parent 指針形成樹形結構,確保資源自動釋放。
QWidget 繼承可視化組件繼承 QObject 的對象樹機制,實現 UI 組件的父子關系與布局管理。

代碼舉例

我們自己封裝一個自己得類,用QLabel來構造,這樣就可以看到他構造和銷毀得過程


字符編碼解析:避免亂碼

  • GBK采用雙字節編碼,即每個字符用 2 個字節來表示,但對于 ASCII 碼中的字符,仍然使用單字節表示,與 ASCII 碼兼容。這樣可以在處理英文等字符時保持高效性,同時又能支持大量的漢字等中文符號。
  • UTF-8是一種變長編碼,它可以使用 1 到 4 個字節來表示一個字符。對于 ASCII 碼中的字符,UTF-8 使用 1 個字節表示,與 ASCII 碼完全兼容;對于常用的漢字等字符,一般使用 3 個字節表示;對于一些生僻字符或特殊符號,可能會使用 4 個字節

UTF-8這個可以在Linux中驗證字節數:

編譯后:

如果你出現了cout輸出時候亂碼,可能就是你用了GBK或則UTF-8,匹配得是GBK:UTF-8,UTF-8 :GBK,他們編碼規則不同如果去匹配就會出錯,這邊可以通過項目目錄去查看當前得文件得編碼規則是什么


坐標

坐標體系:以左上?為原點(0,0),X向右增加,Y向下增加。

其實這個很簡單得,只要你接觸一點前端都知道,qt中得接口也非常得好讀,用起來簡單


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

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

相關文章

Unity 優化封裝常用API和編輯器擴展工具包

資源名&#xff1a;WXTools 文章目錄 MeshRenderEditorSpriteGroupToolWXEditorUtilsComponentUtilsDataUtilsGameObjectUtilsRigidbodyUtilsStringUtilsTransformUtilsVectorUtilsWXTools 內容包括&#xff1a; MeshRenderEditor mesh擴展 SpriteGroupTool SpriteGroup操作…

python學習第三天

條件判斷 條件判斷使用if、elif和else關鍵字。它們用于根據條件執行不同的代碼塊。 # 條件判斷 age 18 if age < 18:print("你還是個孩子&#xff01;") elif age 18:print("永遠十八歲&#xff01;") else:print("你還年輕&#xff01;")…

ThinkPHP使用phpword讀取模板word文件并添加表格

1.安裝phpword包composer require phpoffice/phpword 2.模板文件結構 如上圖框住的是要替換的文本和要復制表格樣式 實現代碼 <?phpnamespace app\api\logic;use PhpOffice\PhpWord\Element\Table; use PhpOffice\PhpWord\SimpleType\TblWidth; use PhpOffice\PhpWord\…

(原創)用python語言基于paddleocr構建批量識別實現紙質和電子的增值稅專用發票程序

文章目錄 1. 說明2. 準備工作3. 代碼3.1 導入庫&#xff1a;3.2 遍歷發票指定處理方式3.3 發票識別相關函數3.4 發票字段定位函數3.6 識別記錄相關函數3.6 識別結果校驗3.7 文件預處理等其他函數3.8 main主函數 1. 說明 1.1 以paddle識別引擎為基礎的增值稅發票識別程序&#…

DeepSeek搭配Excel,制作自定義按鈕,實現辦公自動化!

今天跟大家分享下我們如何將DeepSeek生成的VBA代碼&#xff0c;做成按鈕&#xff0c;將其永久保存在我們的Excel表格中&#xff0c;下次遇到類似的問題&#xff0c;直接在Excel中點擊按鈕&#xff0c;就能10秒搞定&#xff0c;操作也非常的簡單. 一、代碼準備 代碼可以直接詢問…

解決顯示器在高刷條件下花屏的問題

起因是家里的顯示器好久沒用之后&#xff0c;100HZ的刷新率下會花屏&#xff0c;在75HZ的情況下就正常顯示&#xff0c;在網上找了一圈感覺是硬件問題解決不了 于是想了想如果我用90HZ呢&#xff1f;不過原始的情況下沒有自定義刷新率的選擇&#xff0c;不過amd和nvida控制面板…

IP-----雙重發布

目錄 6.雙重發布 1.重發布的作用 2.部署條件 1.必須存在ASBR 2.種子度量值 3.重發布的規則 4.重發布的數量 5.重發布的場景 1.場景和規則 2.直連和靜態 3.動態RIP 4.動態OSPF 5.更改開銷值 6.重發布的問題1 7.重發布的問題2 1.流量 2.前綴列表 3.偏移列表 4…

藍橋杯試題:DFS回溯

一、題目要求 輸入一個數組n&#xff0c;輸出1到n的全排列 二、代碼展示 import java.util.*;public class ikun {static List<List<Integer>> list new ArrayList<>();public static void main(String[] args) { Scanner sc new Scanner(System.in);…

Ruby基礎

一、字符串 定義 283.to_s //轉為string "something#{a}" //定義字符串&#xff0c;并且插入a變量的值 something//單引號定義變量 %q(aaaaaaaaa) // 定義字符串&#xff0c;&#xff08;&#xff09;內可以是任何數&#xff0c;自動轉義雙引號%Q("aaaaa"…

基于提示驅動的潛在領域泛化的醫學圖像分類方法(Python實現代碼和數據分析)

摘要 醫學圖像分析中的深度學習模型易受數據集偽影偏差、相機差異、成像設備差異等導致的分布偏移影響&#xff0c;導致在真實臨床環境中診斷不可靠。領域泛化&#xff08;Domain Generalization, DG&#xff09;方法旨在通過多領域訓練提升模型在未知領域的性能&#xff0c;但…

C#—Settings配置詳解

C#—Settings配置詳解 在C#項目中&#xff0c;全局配置通常指的是應用程序的設置&#xff08;settings&#xff09;&#xff0c;這些設置可以跨多個類或組件使用&#xff0c;并且通常用于存儲應用程序的配置信息&#xff0c;如數據庫連接字符串、用戶偏好設置等。 Settings配置…

國自然面上項目|基于多模態MR影像的膠質母細胞瘤高危區域定位及預后預測研究|基金申請·25-02-28

小羅碎碎念 今天和大家分享一個面上項目&#xff0c;執行年限為2019.01&#xff5e;2022.12&#xff0c;直接費用為57萬元。 膠質母細胞瘤&#xff08;GBM&#xff09;預后差且差異大&#xff0c;異質性是重要因素&#xff0c;臨床手段難評價。影像組學為異質性研究提供方法&am…

Nat Mach Intell | AI分子對接算法評測

《Nature Machine Intelligence》發表重磅評測&#xff0c;系統評估AI與物理方法在虛擬篩選&#xff08;VS&#xff09;中的表現&#xff0c;突破藥物發現效率瓶頸。 核心評測體系&#xff1a;三大數據集 研究團隊構建了三個新型測試集&#xff1a; TrueDecoy&#xff1a;含14…

安路FPGA開發入門:軟件安裝與點燈與仿真(TangDynasty ModelSim)

文章目錄 前言軟件安裝開發軟件仿真軟件 點燈測試代碼編寫與編譯引腳分配固件下載 仿真測試ModelSim添加仿真庫TangDynasty仿真設置進行仿真 后記 前言 最近因為工作需要用安路的FPGA&#xff0c;這里對安路FPGA開發相關流程做個記錄。作為測試只需要一個核心板&#xff08;我這…

千峰React:外部庫引用

flushSync強制刷新 如果不強制刷新是這樣&#xff1a;每次count在下一輪才更新 import { useState, useRef } from react import { flushSync } from react-domfunction App() {const [count, setCount] useState(0)const refuseRef(null)const handleClick () > { setCo…

防火墻旁掛組網雙機熱備負載均衡

一&#xff0c;二層交換網絡&#xff1a; 使用MSTPVRRP組網形式 VLAN 2--->SW3為主,SW4 作為備份 VLAN 3--->SW4為主,SW3 作為備份 MSTP 設計 --->SW3 、 4 、 5 運行 實例 1 &#xff1a; VLAN 2 實例 2 &#xff1a; VLAN 3 SW3 是實例 1 的主根&#xff0c;實…

結合PyMuPDF+pdfplumber,刪除PDF指定文本后面的內容

?? 一、需求場景解析 在日常辦公中,我們經常會遇到這樣的痛點: 合同處理:收到上百份PDF合同,需要找到"簽署頁"之后的內容并刪除報表加工:批量移除財務報表中的敏感數據區域文檔歸檔:快速提取技術文檔的關鍵章節傳統的手動操作方式存在三大致命缺陷: ? 耗時…

二、QT和驅動模塊實現智能家居----2、編譯支持QT的系統

因為我們的Linux內核文件不支持QT系統&#xff08;當然如果你的支持&#xff0c;完全跳過這篇文章&#xff09;&#xff0c;所以我們要從網上下載很多軟件包&#xff0c;這里直接用百問網的軟件包&#xff0c;非常方便。 一&#xff1a;Ubuntu 配置 1 設置交叉編譯工具鏈 以…

el-select的下拉選擇框插入el-checkbox

el-check注意這里要使用model-value綁定數據 <el-selectv-model"selectDevice"multiplecollapse-tags:multiple-limit"5"style"width: 200px"popper-class"select-popover-class" ><el-optionv-for"item in deviceList…

UNION 和 UNION ALL 的區別:深入解析 SQL 中的合并操作

在 SQL 的世界里&#xff0c;當我們需要合并多個查詢結果集時&#xff0c;UNION和UNION ALL是兩個常用的操作符。雖然它們的功能看起來相似&#xff0c;但實際上有著重要的區別&#xff0c;這些區別在不同的應用場景中會對查詢結果和性能產生顯著影響。本文將詳細探討UNION和UN…