QT-窗口類部件

Qt窗口類部件

一、窗口類部件

窗口就是沒有父部件的部件,所以又稱頂級部件。窗口類主要包括基本窗口類QWidget、對話框類QDialog和主窗口類QMainWindow三種。

在這里插入圖片描述

QObject是Qt框架中的一個核心基類,它提供了對象模型和信號槽機制。而QPaintDevice及其子類則提供了繪制和顯示內容的功能。

Paint = 繪制、涂畫

Device = 設備、載體

1、QObject類

QObject類是所有Qt類的基類,它提供了對象模型和信號槽機制。任何對象要實現信號與槽機制,都必須使用Q_OBJECT宏。因此不管是否真正用到信號與槽機制,最好在所有QObject子類中都使用Q_OBJECT宏,避免出現不必要的錯誤。

#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>class MyWidget:public QWidget
{Q_OBJECT
public:explicit MyWidget(QWidget *parent = nullptr);
};#endif // MYWIDGET_H
2、QWidget

Qt 中所有用戶界面對象的基類,是最基本的可視元素。可以作為一個獨立的窗口(頂級窗口部件)存在,或者作為另一個 QWidget 的子部件(嵌入式窗口部件)。

沒有劃分菜單、工具欄、狀態欄、主窗口 等區域。

在這里插入圖片描述

3、QMainWindow

是 QWidget的子類,包含菜單欄,工具欄,狀態欄,標題欄等,中間部分則為主窗口區域。

在這里插入圖片描述

4、QDialog

是 QWidget 的子類,用于與用戶進行簡短交互,如確認操作。

對話框在外觀上和基本窗口相似。通常由標題欄、客戶區、邊框組成,標題欄上有關閉按鈕。

在這里插入圖片描述

二、基本窗口類QWidget

QWidget類是所有用戶界面類的基類,也是所有可視組件(窗口部件)的基類,所有的窗口、按鈕、標簽、文本框等控件都是直接或間接從QWidget派生而來。

  • 既可以作為獨立窗口存在,也可以作為另一個窗口部件的子部件嵌入其中。
  • 通常用于創建不帶特定框架結構(如菜單欄、工具欄)的窗口或自定義界面組件。

創建QWidget窗口的代碼示例:

#include "widget.h"            // 引入自定義的頭文件(通常包含 QWidget 子類,如果沒定義可以不需要)
#include <QApplication>        // 引入 QApplication 類,Qt 程序的入口類
#include <QWidget>             // 引入 QWidget 類,Qt 所有控件的基類
#include <QDebug>              // 引入 QDebug,方便調試時打印信息int main(int argc, char *argv[])
{QApplication a(argc, argv); // 創建 Qt 應用程序對象,接收命令行參數,管理整個 Qt 程序的運行環境QWidget w;                  // 創建一個 QWidget 窗口對象(窗口部件實例)w.setWindowTitle("這里是標題"); // 設置窗口的標題欄文字w.resize(300,200);          // 設置窗口的大小(寬 300,高 200),只影響用戶區域,不包含標題欄和邊框w.move(500,500);            // 將窗口移動到屏幕上的位置(左上角坐標為 x=500, y=500)w.setCursor(Qt::UpArrowCursor); // 設置鼠標指針的形狀為“向上箭頭”光標// w.setCursor(Qt::PointingHandCursor); // (另一種光標示例:手形光標)w.show();                   // 顯示窗口(默認隱藏,必須調用 show() 才能在屏幕顯示)return a.exec();            // 啟動 Qt 事件循環,等待并處理用戶操作(比如鼠標、鍵盤、窗口事件)
}
  • QApplication:整個 Qt GUI 程序必須有且只有一個,用來管理事件循環。
  • Cursor:(光標)
  • QWidget:最基礎的窗口類,可以單獨作為窗口,也可以作為控件嵌入其他窗口。
  • w.setXXX(...):調用 QWidget 提供的接口設置窗口屬性。
  • w.show():把窗口顯示出來。
  • a.exec():進入消息循環,沒有它程序會一閃而過。
三、主窗口類QMainWindow

QMainWindow類的實例是一個可以設置菜單欄、工具欄、狀態欄的主應用程序窗口。主要組成部分:

  1. 菜單欄 (Menu Bar): 位于窗口頂部,通常包含多個菜單。
  2. 工具欄 (Toolbars): 可以放置在窗口的頂部、底部或兩側,包含常用的按鈕和控件。
  3. 狀態欄 (Status Bar): 位于窗口底部,顯示一些臨時信息或狀態。
  4. 中心窗口部件 (Central Widget): 位于主窗口的中央區域,可以放置任何 QWidget 子類的實例。這個中心窗口部件可以有自己的布局。

在這里插入圖片描述

int main(int argc, char *argv[])
{QApplication a(argc, argv);     // 創建 Qt 應用程序對象,管理整個應用的事件循環和資源QMainWindow w;                  // 創建一個 QMainWindow 對象(主窗口),適合做應用的框架界面w.setWindowTitle("主窗口");      // 設置窗口標題為“主窗口”QMenuBar *bar = w.menuBar();    // 獲取主窗口自帶的菜單欄指針(QMainWindow 已經內置了菜單欄)// ====== 創建一個“文件”菜單(含快捷鍵 Alt+F)======QMenu *fmenu = new QMenu("文件(&F)");  // 創建“文件”菜單,&F 表示按 Alt+F 激活此菜單fmenu->addAction("新建文件");          // 在“文件”菜單里添加一個動作(菜單項)→“新建文件”fmenu->addMenu("訪問最近文件");        // 在“文件”菜單里再添加一個子菜單 →“訪問最近文件”// ====== 把“文件”菜單加入菜單欄 ======bar->addMenu(fmenu);                   // 將“文件”菜單添加到菜單欄bar->addMenu("編輯(&E)");              // 在菜單欄添加“編輯”菜單,快捷鍵 Alt+Ebar->addMenu("構建(&B)");              // 在菜單欄添加“構建”菜單,快捷鍵 Alt+Bbar->addMenu("調試(&D)");              // 在菜單欄添加“調試”菜單,快捷鍵 Alt+Dw.setMenuBar(bar);                     // 將菜單欄設置到主窗口(可省略,默認已有)// ====== 設置狀態欄 ======w.statusBar()->showMessage("狀態欄信息");  // 在主窗口底部的狀態欄顯示提示信息w.show();                              // 顯示主窗口return a.exec();                       // 啟動事件循環,等待并處理用戶操作
}
  • QMainWindow 自帶菜單欄、工具欄、狀態欄等,適合做應用主框架。
  • QMenuBar → 菜單欄容器。
  • QMenu → 菜單項(可以有子菜單和動作)。
  • QStatusBar → 窗口底部的提示信息欄。
  • Bar→ 欄、條、橫條
四、對話框類QDialog

對話框窗口的基類,用于創建模態或非模態的對話框窗口。對話框是與用戶進行簡短交互的頂層窗口,通常用于顯示消息或執行一些臨時性的任務。

  • 模態對話框:在模態對話框打開時,它會阻塞其父窗口或整個應用程序,直到用戶關閉對話框。這意味著用戶必須先處理對話框中的任務,才能繼續與應用程序的其他部分交互。
  • 非模態對話框:非模態對話框則不會阻止用戶與其父窗口或其他窗口的交互,它獨立于主窗口運行,允許用戶同時操作多個窗口。
int main(int argc, char* argv[])
{QApplication a(argc, argv);   // 創建應用程序對象,管理整個事件循環Widget w;                     // 創建一個自定義窗口部件(Widget 繼承自 QWidget)w.show();                     // 顯示這個主窗口QDialog d;                    // 創建一個 QDialog 對話框對象d.setWindowTitle("對話框");     // 設置對話框標題為“對話框”d.setModal(true);             // 設置為模態對話框(對話框關閉前,無法操作主窗口)d.resize(200, 100);           // 設置對話框的大小為 200×100d.show();                     // 顯示對話框(非阻塞方式)return a.exec();              // 啟動事件循環,程序進入消息處理狀態
}
  • Widget w:主窗口(你自定義的窗口類,通常繼承自 QWidget)。
  • QDialog d:對話框窗口,標題是“對話框”。
  • setModal(true):因為是模態對話框,所以當對話框沒關閉時,不能點擊主窗口
  • show():顯示對話框,但不會阻塞代碼(對比 exec())。
1. 補充
  1. 模態(Modal)

    • 阻塞用戶對其他窗口的操作。
    • 常用于提示用戶“必須先完成當前操作”。
    • 例子:彈出“保存/取消”的對話框。
  2. 非模態(Modeless)

    • 不阻塞其他窗口,可以同時操作。
    • 常用于工具窗口。
  3. QDialog::show() vs QDialog::exec()

    • show()非阻塞,只是顯示窗口,程序會繼續執行。
    • exec()阻塞,對話框關閉前,程序停在這里(常用于模態對話框)。
2. setModal(true)exec()的區別

1?? setModal(true)

  • 作用:設置對話框為 模態(Modal)。

  • 影響:用戶在對話框沒關閉前,不能操作其它窗口(比如主窗口)。

  • 顯示方式:它還是要配合 show() 來顯示。

    QDialog d;
    d.setModal(true);
    d.show();   // 模態對話框(禁止操作主窗口),但程序繼續往下走
    qDebug() << "這行會立刻執行";
    

👉 模態只是限制 用戶交互,但 不會阻塞代碼執行


2?? exec()

  • 作用:顯示對話框,同時進入一個 本地事件循環

  • 影響:用戶必須關閉對話框,程序代碼才會往下執行。

  • 等價效果模態 + 阻塞

    QDialog d;
    d.exec();   // 模態 + 阻塞,必須關閉對話框,程序才會繼續
    qDebug() << "只有關掉對話框,這行才會執行";
    

3?? 區別總結

  • setModal(true) + show()模態非阻塞
    • 用戶不能操作主窗口,但程序代碼繼續運行。
  • exec()模態阻塞
    • 用戶不能操作主窗口,程序代碼也會停在這里,等對話框關閉才繼續。

4?? 小口訣

  • setModal(true) 控制的是:用戶能不能點主窗口
  • exec() 控制的是:程序能不能繼續往下執行
五、總結
1. QWidget
  • 定義:Qt 所有可視化界面控件的基類(Widget = 窗口部件/控件)。
  • 特點
    • 可以作為獨立窗口(如果沒有父對象)。
    • 可以作為子控件嵌套在別的控件里(比如按鈕、文本框)。
    • 提供了基本的繪制、事件處理(鼠標、鍵盤)、布局功能。
  • 中文理解:小部件 / 控件。
  • 例子:按鈕 (QPushButton)、標簽 (QLabel)、輸入框 (QLineEdit) 都繼承自 QWidget

2. QMainWindow
  • 定義:繼承自 QWidget 的一個主窗口類,是 Qt 專門為應用程序的主界面準備的。
  • 特點
    • 內置了菜單欄(Menu Bar)、工具欄(Tool Bar)、狀態欄(Status Bar)、停靠窗口(Dock Widget)、中心窗口(Central Widget)等。
    • 適合用來做應用程序的主框架界面。
  • 中文理解:主窗口。
  • 例子:像 Qt Creator、Word 這種有菜單欄、工具欄的程序,通常用 QMainWindow 搭建。

3. QDialog
  • 定義:繼承自 QWidget對話框類,通常用來做臨時窗口。
  • 特點
    • 默認是 模態窗口(Modal):彈出后會阻塞主窗口輸入,直到關閉。
    • 也可以設為 非模態(Modeless):和主窗口同時交互。
    • 常用于彈出提示框、登錄框、設置對話框。
  • 中文理解:對話框。
  • 例子:彈出的“確認/取消”窗口就是 QDialog

4. 三者關系
  1. QObject
  • 提供對象模型、信號槽機制。
  1. QPaintDevice
  • 提供繪制接口,所有可繪制的類都要繼承它(QWidget、QPixmap、QImage…)。
  1. QWidget
  • 繼承自 QObject(能發信號/槽)和 QPaintDevice(能被繪制)。
  • 是所有控件的基類。
  1. QDialog / QMainWindow
  • 都是 QWidget 的子類。

  • QMainWindow適合做“程序主界面”,有完整的菜單、工具欄、狀態欄。

  • QDialog適合做“臨時對話框”,比如登錄、提示、設置。

📌 類關系圖(簡化版):

QObject└── QWidget (同時繼承自 QPaintDevice)├── QDialog└── QMainWindow

? 總結一句:

  • QPaintDeviceQWidget 提供了“能畫”的能力;
  • QObjectQWidget 提供了“能通信”的能力;
  • 所以 QWidget 是 Qt 控件的核心基類,在它之上才有 QDialogQMainWindow

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

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

相關文章

【CSP初賽】程序閱讀3

文章目錄前置知識閱讀程序判斷選擇答案解析判斷選擇總結前置知識 埃氏篩素數、C 基礎。 閱讀程序 #include <bits/stdc.h> using namespace std; int main(){int a1[51] {0};int i,j,t,t2,n 50;for(i 2;i<sqrt(n);i){if(a1[i] 0){t2 n/i;for(j 2;j<t2;j) …

【ESP32-IDF】高級外設開發4:SPI

系列文章目錄 持續更新中… 文章目錄系列文章目錄前言一、SPI概述1.主要功能2.SPI控制器架構3.SPI通信模式4.SPI數據幀與事務5.DMA與傳輸性能6.中斷與驅動事件二、SPI類型定義及相關API三、SPI示例程序總結前言 在嵌入式開發中&#xff0c;SPI&#xff08;串行外設接口&#…

遙感機器學習入門實戰教程|Sklearn案例⑧:評估指標(metrics)全解析

很多同學問&#xff1a;“模型好不好&#xff0c;怎么量化&#xff1f;” 本篇系統梳理 sklearn.metrics 中常用且“夠用”的多分類指標&#xff0c;并給出一段可直接運行的示例代碼&#xff0c;覆蓋&#xff1a;準確率、宏/微/加權 F1、Kappa、MCC、混淆矩陣&#xff08;計數/…

【Bluedroid】深入解析A2DP SBC編碼器初始化(a2dp_sbc_encoder_init)

SBC(Subband Coding)作為藍牙 A2DP 協議的標準編解碼器,其編碼器的初始化與參數配置直接影響音頻傳輸的音質、效率與兼容性。本文基于Andoird A2DP 協議棧源碼,系統剖析 SBC 編碼器的初始化流程,包括核心參數(比特池、采樣率、聲道模式等)的解析、計算與動態調整邏輯,以…

linux shell測試函數

在 C 語言中&#xff0c;int main(int argc, char *argv[])是程序的入口函數&#xff0c;而??在 main函數中調用專門的測試邏輯&#xff08;如測試函數&#xff09;??的程序結構&#xff0c;通常被稱為??測試程序&#xff08;Test Program&#xff09;??或??測試驅動…

【Java SE】抽象類、接口與Object類

文章目錄一、 抽象類&#xff08;Abstract Class&#xff09;1.1 什么是抽象類&#xff1f;1.2 抽象類的語法1.2.1 定義抽象類1.2.2 繼承抽象類1.3 抽象類的特性1.3.1 不能直接實例化1.3.2 抽象方法的限制1.3.3 抽象類可以包含構造方法1.3.4 抽象類不一定包含抽象方法1.3.5 抽象…

Autodl 創建新虛擬環境 python3.9

問題&#xff1a;本人在autodl上保存的環境因為很長時間沒有開機&#xff0c;autodl竟然給我刪除了。后來看了官網的介紹我才發現&#xff0c;原來15天不開機&#xff0c;autodl就會自動釋放實例。 因此&#xff0c;我就自己重新選了一個虛擬環境&#xff0c;從頭開始配置。 GP…

應急響應靶機-WindowsServer2022挖礦事件

依舊手癢開局&#xff0c;知攻善防實驗室的原創靶機 https://mp.weixin.qq.com/s/URrNHvQSnFKOyefHKXKjQQ 相關賬戶密碼&#xff1a; Administrator/zgsf123 注意&#xff1a;做個原始快照&#xff08;方便日后復習&#xff09;&#xff0c;安裝VMware tool&#xff08;安裝后圖…

PCB電路設計學習3 電路原理圖設計 元件PCB封裝設計與添加

目錄PCB電路設計學習3五、電路原理圖設計5.1 32個發光二極管電路5.2 單片機外圍電路5.3 供電與程序下載電路5.4 連接各部分網絡&#xff0c;繪制邊框和說明六、元件PCB封裝設計與添加6.1 名詞解釋6.2 繪制PCB附學習參考網址歡迎大家有問題評論交流 (* ^ ω ^)PCB電路設計學習3 …

redis---常用數據類型及內部編碼

Redis 中每種常用數據類型都對應多種內部編碼&#xff0c;這些編碼會根據數據特征&#xff08;如大小、數量&#xff09;自動切換&#xff0c;以平衡存儲效率和操作性能。1.字符串&#xff08;String&#xff09;用途&#xff1a;存儲文本、數字或二進制數據&#xff0c;是最基…

crypto.randomUUID is not a function

在本地運行時 crypto.randomUUID 好使&#xff0c;build 后放到服務器上用域名訪問就不好使。原因&#xff1a;瀏覽器策略&#xff0c;瀏覽器在非https、localhost的環境中訪問時&#xff0c;crypto.randomUUID 是不可用的開發時使用的是localhost正常訪問 生產臨時使用的是htt…

【思考】什么是服務器?什么是服務?什么是部署?

文章目錄1 什么是服務器&#xff1f;什么是服務&#xff1f;端口是什么意思&#xff1f;2 什么是部署&#xff1f;1 什么是服務器&#xff1f;什么是服務&#xff1f;端口是什么意思&#xff1f; 服務器本質是一臺運行著程序的電腦&#xff0c;它可以運行著很多程序&#xff0c…

自動駕駛導航信號使用方式調研

1 總結 本文調研在給定導航信號后&#xff0c;如何在端到端架構下&#xff0c;利用導航信息引導軌跡生成。 目前主流的方案可以分為2種。一種是將導航作為“前置引導”深度融入軌跡生成過程&#xff08;導航前置型&#xff09;&#xff1b;另一種則是將導航作為“后置評價”標準…

玳瑁的嵌入式日記D21-08020(數據結構)

雙向鏈表double link listtypedef struct dou_node { DATATYPE data; struct dou_node *prev; struct dou_node *next; }DouLinkNode;雙向鏈表&#xff1a;節點 數據 NEXT PREV . 手撕代碼(增加刪除) 增加&#xff0c;刪除的操作&#xff0c; 需要 tmp 停止待操作節點的前一…

Uipath查找元素 查找子元素 獲取屬性活動組合使用示例

Uipath 查找元素 查找子元素 獲取屬性組合使用示例使用場景案例介紹項目流程圖附加瀏覽器查找元素查找子元素遍歷循環獲取屬性點擊元素使用場景 在實際場景中&#xff0c;有時需RPA自動點擊某組范圍元素或獲取某組范圍元素的值&#xff0c;如需獲取指定的父元素&#xff0c;再…

【MongoDB與MySQL對比】

MongoDB 與 MySQL 全方位對比分析在現代軟件開發中&#xff0c;數據庫的選擇直接影響系統性能、擴展性和開發效率。MongoDB 和 MySQL 作為兩種主流數據庫&#xff0c;分別代表了 NoSQL 和關系型數據庫的典型&#xff0c;各自在不同場景中發揮著重要作用。本文將拋開代碼示例&am…

Spring AI開發指導-對話模型

對話模型接口描述Spring AI基于Spring Cloud的架構體系&#xff0c;定義了一系列可擴展的API接口&#xff0c;支持對接不同類型的AI大模型的核心功能&#xff0c;這些API接口支持同步編程模式或者異步編程模式&#xff1a;接口ModelModel是同步編程模式接口&#xff0c;其參數支…

Win11 下卸載 Oracle11g

目錄 1、停止服務 2、啟動 Universal install 應用 3、執行 deinstall.bat 腳本 4、刪除注冊表相關數據 5、刪除環境變量中的oracle相關路徑 6、刪除安裝文件 7、刪除C盤中的相關Oracle文件 8、刪除 Oracle 數據存放目錄 9、檢查 10、重裝oracle可能還會碰到的問題 &…

深入剖析Spring Boot應用啟動全流程

目錄 前言 啟動流程概覽 一、第一階段&#xff1a;初始化SpringApplication 二、第二階段&#xff1a;運行SpringApplication 三、第三階段&#xff1a;環境準備 四、第四階段&#xff1a;創建應用上下文 五、第五階段&#xff1a;準備應用上下文 六、第六階段&#xf…

Matplotlib 可視化大師系列(三):plt.bar() 與 plt.barh() - 清晰對比的柱狀圖

目錄Matplotlib 可視化大師系列博客總覽Matplotlib 可視化大師系列&#xff08;三&#xff09;&#xff1a;plt.bar() 與 plt.barh() - 清晰對比的柱狀圖一、 柱狀圖是什么&#xff1f;何時使用&#xff1f;二、 函數原型與核心參數plt.bar(x, height, ...) - 垂直柱狀圖plt.ba…