【Qt開發】Qt的背景介紹(四)

目錄

1 -> Qt Hello World 程序

1.1 -> 使用“按鈕”實現

1.1.1 -> 純代碼方式實現

1.1.2 -> 可視化操作實現

1.2 -> 使用“標簽”實現

1.2.1 -> 純代碼方式實現

1.2.2 -> 可視化操作實現

2 -> 項目文件解析

2.1 -> .pro文件解析

2.2 -> widget.h文件解析?

2.3 -> main.cpp文件解析

2.4 -> widget.cpp文件解析

2.5 -> widget.ui文件解析

3 -> Qt 編程注意事項

3.1 -> Qt 中的命名規范

3.2 -> Qt Creator 中的快捷鍵

3.3 -> 使用幫助文檔

3.4 -> 認識對象模型(對象樹)

3.5 -> Qt 窗口坐標體系


1 -> Qt Hello World 程序

1.1 -> 使用“按鈕”實現

1.1.1 -> 純代碼方式實現

實現效果如下:

1.1.2 -> 可視化操作實現

1. 雙擊“widget.ui”文件

2. 拖拽控件至ui界面窗口并修改內容

3. 構建并運行,實現效果如下:

1.2 -> 使用“標簽”實現

1.2.1 -> 純代碼方式實現

實現效果:

1.2.2 -> 可視化操作實現

1. 雙擊“widget.ui”文件

2. 拖拽“標簽”至ui設計界面中,并雙擊修改標簽內容

3. 實現效果如下

2 -> 項目文件解析

2.1 -> .pro文件解析

工程新建好之后,在工程目錄列表中有?個后綴為 ".pro" 的文件, ".pro" 文件就是工程文件?(project),它是 qmake 自動生成的用于生產?makefile 的配置文件。如圖所示:

雙擊進?該文件,該文件的核心內容如下:
QT += core gui // Qt 包含的模塊
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets //大于 Qt4 版本才包含 widget 模塊
TARGET = QtFirst //應用程序名生成的 .exe 程序名稱
TEMPLATE = app //模板類型,應用程序模板
SOURCES += main.cpp\ //源文件
widget.cpp //源文件
HEADERS += widget.h //頭文件
".pro" 文件的寫法如下:
1.?注釋:從 "#" 開始,到這?行結束。
2. QT += core gui // Qt 包含的模塊 Qt5 包含的模塊如下圖所示:

3. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 這條語句的含義是,如果QT_MAJOR_VERSION 大于 4 也就是當前使?的 Qt5 及更高版本) 需要增加 widgets 模塊。如果項目僅需支持?Qt5 , 也可以直接添加 "QT += widgets" ?句。不過為了保持代碼兼容 ,最好還是按照 QtCreator 生成的語句編寫。
4. 指定生成的應用程序名:TARGET = QtDemo
5. TEMPLATE = app //模板。告訴 qmake 為這個應用程序生成哪種 makefile。下面是可供選擇的模板:
  • app:建立?個應?程序的 makefile。這是默認值,所以如果模板沒有被指定,這個將被使 用。
  • lib :建立?個庫的 makefile。
  • vcapp:建立?個應用程序的 VisualStudio 項目文件。
  • ?vclib: 建立?個庫的 VisualStudio 項目文件。
  • subdirs:這是?個特殊的模板,它可以創建?個能夠進?特定目錄的 makefile 并且為它調用make 的 makefile。
6. 工程中包含的源文件:SOURCES += main.cpp/widget.cpp
7. 工程中包含的頭文件:HEADERS += widget.h
8. 工程中包含的資源文件:RESOURCES += painter.qrc
9. 工程中包含的 "ui" 設計文件:FORMS += widget.ui
10. 配置信息:CONFIG += c++11 (使用 c++11 的特性) CONFIG 用來告訴 qmake 關于應用程序的配置信息。

2.2 -> widget.h文件解析?

在Qt中,如果要使用信號與槽(signal 和 slot)的機制 就必須加入?Q_OBJECT 宏;
Ui::Widget *ui; 這個指針是用前面聲明的 namespace Ui 里的 Widget 類定義的,所以指針 ui 是指向可視化設計的界面,后?要訪問界面上的組件,都需要通過這個指針 ui 去訪問。

2.3 -> main.cpp文件解析

使用Qt Creator新建任意工程之后,main.cpp文件中都會自動生成如下代碼:

解釋:

1. Qt 系統提供的標準類名 聲明頭文件沒有 .h 后綴;
2. Qt ?個類對應?個頭文件,類名 就是 頭文件名;
3. QApplication 為應用程序類;QApplication a;(a為應用程序對象,有且僅有?個。)
  • QApplication 管理圖形用戶界面應用程序的控制流和主要設置。
  • QApplication 是 Qt 的整個后臺管理的命脈。它包含主事件循環,在其中來自窗口系統和其它 資源的所有事件處理和調度。它也處理應用程序的初始化和結束,并且提供對話管理。
  • 對于任何?個使用 Qt 的圖形用戶界面應用程序,都正好存在?個 QApplication 對象,而不論 這個應用程序在同?時間內是不是有 0、1、2 或更多個窗?。
4. myWidget w; //實例化窗口對象
5. w.show(); //調用show函數顯示窗口
6. a.exec() :程序進?消息循環,等待對用戶輸入進行響應。這里?main()把控制權轉交給Qt,Qt 完成事件處理工作,當應用程序退出的時候 exec() 的值就會返回。在 exec() 中,Qt 接受并處理用戶和系統的事件并且把它們傳遞給適當的窗口部件。

2.4 -> widget.cpp文件解析

widget.cpp 文件是類 Widget 的實現代碼,所有的窗體上要實現的功能添加在此文件中

2.5 -> widget.ui文件解析

widget.ui 是窗體界面定義文件,是?個 XML 文件,定義了窗口上的所有組件的屬性設置、布局,及其信號與槽函數的關聯等。用?UI 設計器可視化設計的界面都由 Qt 自動解析,并以 XML 文件的形式保存下來。在設計界?時,只需在 UI 設計器里進行可視化設計即可,而不用管 widget.ui 文件是怎么生成的。

3 -> Qt 編程注意事項

3.1 -> Qt 中的命名規范

  • 類名:首字母大寫,單詞和單詞之間的首字母大寫
  • 函數名及變量名:首字母小寫,單詞和單詞之間首字母大寫

Qt 偏好駝峰命名法,這點不同于C/C++偏好蛇形命名法。

3.2 -> Qt Creator 中的快捷鍵

  • 注釋:ctrl + /
  • 運行:ctrl + R
  • 編譯:ctrl + B
  • 字體縮放:ctrl + 鼠標滾輪
  • 查找:ctrl + F
  • 整行移動:ctrl + shift +??/?
  • 幫助文檔:F1
  • 自動對齊:ctrl + i
  • 同名之間的 .h 和 .cpp 的切換:F4
  • 生成函數聲明的對應定義:alt + enter

3.3 -> 使用幫助文檔

打開幫助文檔有三種方式,實際編程中使用哪種都行。

1. 光標要放到要查詢的類名/方法名上,直接按F1

2. Qt Creator 左側邊欄中直接用鼠標單擊“幫助”按鈕

點擊“幫助”之后,出現如下界面:

3. 找到 Qt Creator 的安裝路徑,在“bin”文件夾下找到 assistant.exe,雙擊打開

使用示例

1. 新建項目,在新建項目中使用 Qt 中的“QPushButton”控件

2. 打開幫助手冊,在“索引”里面輸入“QPushButton”

3.4 -> 認識對象模型(對象樹)

在 Qt 中創建很多對象的時候會提供?個 Parent 對象指針,下?來解釋這個 parent 到底是?什么的。
1.?QObject 是以對象樹的形式組織起來的。?
  • 當創建?個 QObject 對象時,會看到 QObject 的構造函數接收?個 QObject 指針作為參數,這個參數就是 parent,也就是?對象指針。
  • 這相當于,在創建 QObject 對象時,可以提供?個其?對象,我們創建的這個 QObject 對象會?動添加到其?對象的 children() 列表。
  • 當?對象析構的時候,這個列表中的所有對象也會被析構。(注意,這?的?對象并不是繼承意義上的?類!)

這種機制在 GUI 程序設計中相當有?。例如,?個按鈕有?個 QShortcut(快捷鍵)對象作為其 ?對象。當刪除按鈕的時候,這個快捷鍵理應被刪除。這是合理的。

2.?QWidget 是能夠在屏幕上顯?的?切組件的?類。
  • QWidget 繼承? QObject ,因此也繼承了這種對象樹關系。?個孩??動地成為?組件的? 個?組件。因此,它會顯?在?組件的坐標系統中,被?組件的邊界剪裁。例如,當??關閉 ?個對話框的時候,應?程序將其刪除,那么,我們希望屬于這個對話框的按鈕、圖標等應該 ?起被刪除。事實就是如此,因為這些都是對話框的?組件。
  • 當然,我們也可以??刪除?對象,它們會?動從其?對象列表中刪除。?如,當我們刪除了 ?個?具欄時,其所在的主窗?會?動將該?具欄從其?對象列表中刪除,并且?動調整屏幕 顯?。

Qt 引?對象樹的概念,在?定程度上解決了內存問題。

  • 當?個 QObject 對象在堆上創建的時候,Qt 會同時為其創建?個對象樹。不過,對象樹中對象的 順序是沒有定義的。這意味著,銷毀這些對象的順序也是未定義的。
  • 任何對象樹中的 QObject 對象 delete 的時候,如果這個對象有 parent,則?動將其從 parent 的 children() 列表中刪除;如果有孩?,則?動 delete 每?個孩?。Qt 保證沒有 QObject 會被 delete 兩次,這是由析構順序決定的。
如果 QObject 在棧上創建,Qt 保持同樣的?為。正常情況下,這也不會發?什么問題。來看下?的代碼?段:

作為?組件的 window 和作為?組件的 quit 都是 QObject 的?類(事實上,它們都是QWidget的?類,?QWidget 是 QObject 的?類)。這段代碼是正確的,quit 的析構函數不會被調?兩次,因為標準 C++ 要求,局部對象的析構順序應該按照其創建順序的相反過程。因此,這段代碼在超出作?域時,會先調? quit 的析構函數,將其從?對象 window 的?對象列表中刪除,然后才會再調?window 的析構函數。
但是,如果我們使?下?的代碼:

情況?有所不同,析構順序就有了問題。我們看到,在上?的代碼中,作為?對象的 window 會?先被析構,因為它是最后?個創建的對象。在析構過程中,它會調??對象列表中每?個對象的析構函數,也就是說, quit 此時就被析構了。然后,代碼繼續執?,在 window 析構之后,quit 也會被析構,因為 quit 也是?個局部變量,在超出作?域的時候當然也需要析構。但是,這時候已經是第?次調? quit 的析構函數了,C++ 不允許調?兩次析構函數,因此,程序崩潰了。
由此我們看到,Qt 的對象樹機制雖然在?定程度上解決了內存問題,但是也引?了?些值得注意的事情。這些細節在今后的開發過程中很可能時不時跳出來煩擾?下,所以,我們最好從開始就養成良好習慣。

在Qt中,盡量在構造的時候就指定 parent 對象,并且大膽在堆上創建。

Qt 對象樹如圖

代碼示例

1. 創建一個新工程并編譯運行,生成如下窗口

2. 選中工程名,鼠標右鍵 => “add new……”(或者“添加新文件”)

3. 選擇“choose……”,彈出如下界面

4. 點擊“下一步”,彈出如下對話框

5. 點擊“完成”之后,手動創建類的頭文件以及源文件會自動添加到目標工程中

6. 修改頭文件

7. 編寫源文件

8. 編譯并運行

9. 當關閉彈出的對話框時,就會自動調用按鈕的析構函數

10. 觀察析構函數的執行順序

11. 執行結果

12. 執行結果分析

對象樹確保的是先釋放子節點的內存,后釋放父節點的內存。

而析構函數的調用順序則不一定遵守上述要求,因此看到子節點的析構執行順序反而在父節點析構順序之后。

注意:

調用析構函數和釋放內存并非是同一件事情。

3.5 -> Qt 窗口坐標體系

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

對于嵌套窗口,其坐標是相對于父窗口來說的。

示例:使用 Qt 中的坐標系設置控件的位置。

運行結果如下:


感謝各位大佬支持!!!

互三啦!!!

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

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

相關文章

Linux驅動開發筆記(六)——pinctrl GPIO

開發板:imx6ull mini 虛擬機:VMware17 ubuntu:ubuntu20.04 視頻:第8.1講 pinctrl和gpio子系統試驗-pincrl子系統詳解_嗶哩嗶哩_bilibili 文檔:《【正點原子】I.MX6U嵌入式Linux驅動開發指南.pdf》四十五章 這一章…

SpringBoot 快速上手:從環境搭建到 HelloWorld 實戰

在 Java 開發領域,Spring 框架占據著舉足輕重的地位,但它復雜的配置曾讓不少開發者望而卻步。SpringBoot 的出現,如同為 Spring 框架裝上了 “加速器”,以 “約定大于配置” 的理念簡化了開發流程。本文將從環境準備、Maven 配置入…

圖、最小生成樹與最短路徑

目錄 并查集 并查集實現 圖 概念 圖的存儲結構 鄰接矩陣 鄰接表 無向圖 有向圖 圖的遍歷 廣度優先遍歷 深度優先遍歷 最小生成樹 Kruskal算法(克魯斯卡爾算法) Prim算法(普利姆算法) 最短路徑 單源最短路徑--Dij…

互聯網電商新生態:開源AI智能名片、鏈動2+1模式與S2B2C商城小程序的融合賦能

摘要:本文聚焦互聯網電商領域,探討在當下直播電商蓬勃發展的背景下,開源AI智能名片、鏈動21模式以及S2B2C商城小程序如何相互融合,為創業者、企業和淘寶主播IP等電商參與者帶來新的發展機遇。通過分析各要素的特點與優勢&#xff…

企業車輛|基于SprinBoot+vue的企業車輛管理系統(源碼+數據庫+文檔)

企業車輛管理系統 基于SprinBootvue的企業車輛管理系統 一、前言 二、系統設計 三、系統功能設計 系統功能實現 后臺模塊實現 管理員模塊實現 駕駛員模塊實現 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取: 博…

自學嵌入式第二十五天:數據結構-隊列、樹

一、隊列隊列是只允許一段進行插入,另一端進行刪除操作的線性表;允許插入的一端叫隊尾,允許刪除的一端叫對頭;先進先出;用于解決速度不匹配(例如一快一慢),做緩沖用;二、…

MySQL索引原理與優化全解析

1、MySQL索引是什么? 在關系數據庫中,索引是一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標志這些值的數據頁的邏輯指針清單。索引的作用相當于圖書的目錄&a…

模型對話狀態管理方法詳解

模型對話狀態管理方法詳解 目錄 簡介手動管理對話狀態構建對話歷史追加響應內容 API 支持的自動化對話狀態管理使用 previous_response_id 鏈接話輪 Token 及上下文窗口管理上下文窗口定義與限制Token 計數與工具 安全與合規注意事項結語1. 簡介 在多輪對話場景中,合…

GPT-5 上線風波深度復盤:從口碑兩極到策略調整,OpenAI 的變與不變

摘要: 近日,備受矚目的 GPT-5 正式上線,卻意外地在社區引發了兩極化爭議。面對技術故障與用戶質疑,OpenAI 迅速推出一系列補救措施。本文將深度復盤此次發布風波,解析其背后的技術挑戰與應對策略,并探討這一…

【Android】使用FragmentManager動態添加片段

三三要成為安卓糕手 上一篇文章,我們是在xml中靜態添加fragment,但是一些修改或者其他事情是做不了的; 本章我們達成在java代碼中靈活添加、刪除、替換fragment操作 一:核心代碼展示 簡單做一個這種頁面public class FragmentActi…

MiniOB環境部署開發(使用開源學堂)

整體思路: 1.使用開源學堂在線編程環境開發MiniOB編譯環境 2.使用vscode進行代碼調試和開發以及上傳到倉庫 MiniOB源碼:https://github.com/oceanbase/miniob MiniOB文檔:MiniOB 介紹 - MiniOB 數據庫大賽官網:OceanBase 社區…

09_常用內置模塊進階

第9課:常用內置模塊進階 課程目標 深入學習Python常用內置模塊掌握collections、itertools、functools等模塊學習json、csv、pickle等數據處理模塊 1. collections模塊 1.1 Counter類 from collections import Counter# 統計元素出現次數 text "hello world p…

? Ranger 基礎命令與功能詳解

📌 1. Ranger簡介 Ranger(游俠)是一款 Linux 專用的 指令式文件管理器,其操作風格類似 Vim,通過輸入指令即可完成目錄跳轉、文件編輯、移動、復制等操作。 相比于 mc(Midnight Commander)&…

CUDA安裝教程(包括cuDNN的教程)一個博客帶你了解所有問題

前言 windows10 版本安裝 CUDA ,首先需要下載兩個安裝包 CUDA toolkit(toolkit就是指工具包)cuDNN 注:cuDNN 是用于配置深度學習使用 官方教程 CUDA:Installation Guide Windows :: CUDA Toolkit Documentation …

ArkTS 語言全方位解析:鴻蒙生態開發新選擇

在鴻蒙生態蓬勃發展的當下,一款高效、健壯的開發語言成為開發者的迫切需求。ArkTS 語言應運而生,作為鴻蒙生態的核心應用開發語言,它在 TypeScript(簡稱 TS)基礎上進行創新擴展,為開發者打造高性能、易維護…

JavaScript性能優化實戰:從瓶頸識別到極致體驗

文章目錄JavaScript性能優化實戰:從瓶頸識別到極致體驗1. 引言:為什么JavaScript性能至關重要1.1 性能對用戶體驗的影響1.2 JavaScript性能瓶頸的多樣性2. JavaScript內存管理優化2.1 JavaScript內存模型詳解2.2 垃圾回收機制與優化策略2.3 內存分析實戰…

批量歸一化:不將參數上傳到中心服務器,那服務器怎么進行聚合?

聯邦批量歸一化(FedBN) 是一種聯邦學習客戶端本地模型優化算法。它的核心思想是:在聯邦學習的客戶端本地訓練過程中,保留并獨立更新批量歸一化層(Batch Normalization, BN)的參數,而不將這些參數…

Qt中使用MySQL數據庫

一、MySQL 入門 核心概念 在 QT 中操作數據庫,主要使用兩個模塊: QSqlDatabase:代表一個數據庫連接。 QSqlQuery:用于執行 SQL 語句(如 SELECT, INSERT, UPDATE, DELETE)并處理結果。 環境準備 在編寫代碼之前,你需要確保系統已具備以下條件: 1. 安裝 MySQL 從 M…

Android - 統一資源標識符 Uri

一、概念URI(Uniform Resource Identifier)統一資源標識符,用于標識資源的字符串(如圖片、網頁、文件、應用等)。1.1 與 URL 的區別URL(統一資源定位符)是 URI(統一資源標識符&#…

開源 AR 眼鏡怎么選?OpenGlass ,OSSG,cheApR 分析推薦

開源項目橫評(看完你會知道自己屬于哪一類) 1)OpenGlass:最低成本跑通“能用的AI眼鏡” 賣點:用不到$25的通用元件,把任意普通眼鏡改造成“可黑客化”的智能眼鏡;能錄制、識別、翻譯、記人等。…