Qt Quick 與 QML(二)qml中的頂級窗口

、前言

在QML中,?頂級窗口不是絕對必需的?,但它在大多數應用場景中扮演著關鍵角色。

需要頂級窗口的典型場景:

1.獨立桌面/移動應用?

必須使用WindowApplicationWindow作為根元素。

2.多窗口應用

每個獨立窗口都需要一個頂級窗口實例。

不需要頂級窗口的情況?

1.作為組件嵌入其他窗口

當QML文件被用作子組件時(通過Loader或直接嵌套)

2.嵌入式系統

在嵌入式Linux(如使用EGLFS插件)可直接用Item作根元素

、類型

1.Window(基礎窗口)?

定位?:輕量級通用窗口,類似傳統 GUI 的 QWidget。

功能特性?:

  • 僅提供基礎窗口屬性(標題、尺寸、可見性等)
  • ?無預置框架?:需手動實現標題欄、關閉按鈕28
  • 支持嵌套或獨立使用(如彈窗)

適用場景?:自定義彈窗、簡單浮動窗口、輕量級應用

2.ApplicationWindow(應用主窗口)?

定位?:功能完整的應用框架,類似 QMainWindow。

功能特性?:

  • 內置應用框架結構:支持菜單欄(menuBar)、工具欄(header)、狀態欄(footer)17
  • 內容區域(contentItem)自動管理布局

適用場景?:復雜桌面應用主窗口(需菜單/工具欄)

?3.區別

特性??Window??ApplicationWindow?
?功能定位?輕量級基礎容器完整應用框架
?內置組件?? 無標題欄/菜單欄? 支持菜單欄/工具欄/狀態欄
?內容管理?手動布局子元素提供 contentItem 自動布局區域
?復雜度?低(適合簡單場景)高(適合復雜應用)
?所屬模塊?QtQuick.WindowQtQuick.Controls

關鍵注意?:所有頂級窗口必須顯式設置 visible: true?和有效尺寸(如 width/height),否則會導致界面無法渲染?

屬性

1.Window(基礎窗口)?

需要導入模塊

import QtQuick.Window 2.2

?分類??屬性??類型??說明??示例?
?窗口狀態?visiblebool控制窗口顯示/隱藏(默認falsevisible: true
activebool(只讀)指示窗口是否為活動窗口onActiveChanged: console.log(active)
modalityQt::WindowModality窗口模態類型(非模態/窗口模態/應用模態)modality: Qt.WindowModal
?尺寸位置?width/heightint窗口初始尺寸(像素)width: 800; height: 600

minimumWidth/minimumHeight

maximumWidth/maximumHeight

int窗口最小/最大尺寸限制minimumWidth: 400; maximumHeight: 900
x/yint窗口左上角屏幕坐標x: 100; y: 200
?內容布局?contentItemItem(只讀)窗口內容根ItemComponent.onCompleted: console.log(contentItem)
activeFocusItemItem(只讀)當前獲得鍵盤焦點的子ItemonActiveFocusItemChanged: focusItem.color = "red"
contentOrientationQt::ScreenOrientation強制內容旋轉方向(橫屏/豎屏)contentOrientation: Qt.LandscapeOrientation
?視覺樣式?colorcolor窗口背景色color: "#F0F0F0"
opacityreal透明度(0.0透明~1.0不透明)opacity: 0.8
titlestring窗口標題欄文字title: "設置面板"
?高級控制?flagsQt::WindowFlags窗口行為標志(如無邊框/置頂)flags: Qt.FramelessWindowHint
transientParentQWindow關聯父窗口(用于對話框歸屬)transientParent: mainWindow
screenvariant綁定到特定顯示器3screen: Qt.application.screens
visibilityQWindow::Visibility窗口顯示模式(全屏/最小化等)visibility: Window.FullScreen
?其他?datalist<Object>動態存儲子對象列表通常自動管理

2.ApplicationWindow(應用主窗口)?

分類??屬性??類型??說明??示例?
?焦點控制?activeFocusControlControl當前獲得鍵盤焦點的子控件(只讀屬性)Text { focus: true } // 當該Text獲得焦點時,父控件此屬性指向它
?背景裝飾?backgroundItem控件的背景元素,可覆蓋默認樣式background: Rectangle { color: "lightblue" }
?內容容器?contentDatalist<Object>動態添加子項的默認列表(自動成為contentItem的子項)Component.onCompleted: contentData.push(Qt.createComponent("Button.qml"))
contentItemItem內容項的根容器,用于布局子控件contentItem: RowLayout { spacing: 5 }
?文本樣式?fontfont控件內文本的字體屬性(可繼承)font { family: "Arial"; pixelSize: 16 }
?結構布局?footerItem底部區域(如Page組件的頁腳)footer: ToolBar { Label { text: "Status" } }
headerItem頂部區域(如Page組件的標題欄)header: TabBar { TabButton { text: "Home" } }
?本地化?localeLocale區域設置(影響日期/數字格式)locale: Qt.locale("zh_CN")
?菜單系統?menuBarItem菜單欄容器(ApplicationWindow專用)menuBar: MenuBar { Menu { title: "File" } }
?顏色主題?palettepalette控件的調色板(可覆蓋系統主題)palette { buttonText: "red" }

?menuBar核心屬性與方法

?組件??屬性/方法??類型??說明??示例?
?menuBar?delegateComponent自定義菜單項渲染模板delegate: MenuBarItem { text: model.title }
menuslist<Menu>包含所有子菜單的只讀列表onClicked: console.log(menuBar.menus.length)
addMenu(Menu)Method動態添加菜單menuBar.addMenu(Qt.createQmlObject('Menu{title:"Tools"}', menuBar))
takeMenu(int)Method移除指定索引的菜單menuBar.takeMenu(0).destroy()

header支持的組件類型??

組件類型??說明??典型應用場景??示例代碼?
?ToolBar?標準工具欄組件,通常包含操作按鈕或導航控件應用頂部導航欄header: ToolBar {ToolButton { icon.source: "menu.svg" } Label { text: "應用標題" }}
?TabBar?選項卡欄組件,用于頁面切換多頁面應用的標簽導航header: TabBar {TabButton { text: "首頁" } TabButton { text: "設置" }}
?Rectangle?基礎矩形容器,可自定義顏色/漸變自定義背景的簡單標題欄header: Rectangle {color: "lightblue"; Label { anchors.centerIn: parent; text: "標題" }}
?Row/RowLayout?水平布局容器,排列子控件組合多個控件(圖標+文字)header: RowLayout { Image { source: "logo.png" } Label { text: "系統名稱"; Layout.fillWidth: true }}
?Label?文本標簽簡易標題顯示header: Label {text: "歡迎頁面";horizontalAlignment: Text.AlignHCenter}
?SwipeView?滑動視圖容器可橫向滑動的Banner區域header: SwipeView {Image { source: "banner1.jpg" } Image { source: "banner2.jpg" }}
?自定義組件?用戶復合組件(如MyCustomHeader.qml復用復雜UI結構header: MyCustomHeader { title: "儀表盤" showBackButton: true}

footer支持的組件類型

同上? ,把示例中的header換成footer

、代碼示例

1.Window(基礎窗口)?

import QtQuick 2.6
import QtQuick.Window 2.2Window {visible: truewidth: 400height: 300minimumWidth: 400title: "基礎窗口"flags: Qt.Window | Qt.WindowStaysOnTopHintcolor: "lightyellow"Text {text: qsTr("Hello, World!"); font.pixelSize: 24; anchors.centerIn: parent}
}

?運行結果:

2.ApplicationWindow(應用主窗口)?

import QtQuick 2.6
import QtQuick.Controls 2.14
import QtQuick.Layouts 1.6ApplicationWindow {visible: trueid: mainWindowtitle: "應用主窗口"width: 800height: 600// 菜單欄實現menuBar: MenuBar {Menu {title: "文件"Action {text: "新建"onTriggered: fileHandler.createNew()}Action {text: "打開"onTriggered: fileHandler.openFile()}MenuSeparator {}Action {text: "退出"onTriggered: Qt.quit()}}Menu {title: "編輯"MenuItem {text: "復制"onTriggered: {textCopy.selectAll(); textCopy.copy()}}MenuItem {text: "粘貼"onTriggered: textEditor.paste()}}}// 狀態欄footer: Label {text: "就緒"}header: ToolBar {background: Rectangle {color: "lightyellow"}RowLayout {anchors.fill: parentLabel {text: "Title"elide: Label.ElideRighthorizontalAlignment: Qt.AlignHCenterverticalAlignment: Qt.AlignVCenterLayout.fillWidth: true}ToolButton {text: qsTr("?")onClicked: menu.open()}}}// 主內容區域SplitView {anchors.fill: parentorientation: Qt.VerticalTextEdit {id: textEditorhorizontalAlignment: Text.AlignHCenterwrapMode: TextEdit.WrapSplitView.fillHeight: trueselectByMouse: true}TextEdit {id: textCopyhorizontalAlignment: Text.AlignHCenterwrapMode: TextEdit.Wraptext:"在此輸入要復制的內容"color: "blue"SplitView.minimumWidth: 400selectByMouse: true}}// 業務邏輯處理對象QtObject {id: fileHandlerfunction createNew() {textEditor.text = "新建文件"console.log("新建文件邏輯")}function openFile() {textEditor.text = "打開文件"console.log("打開文件邏輯")}}
}

運行結果:

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

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

相關文章

華為云Flexus+DeepSeek征文|DeepSeek-V3/R1 免費服務開通全流程與Rest API和OpenAI SDK調用詳解

華為云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 免費服務開通全流程與Rest API和OpenAI SDK調用詳解 前言 本文將詳細介紹DeepSeek-V3/R1 免費服務開通全流程&#xff0c;并且詳細講解通過本地方式Rest API和OpenAI SDK兩種方式調用DeepSeek-V3/R1 前提準備 1、訪問 Mod…

Qt 連接信號使用lambda表達式和槽函數的區別

1. 語法與代碼結構 成員函數 需在類中顯式聲明槽函數&#xff08;public slots: 或 Qt 5 后的任意成員函數&#xff09;&#xff0c;并在連接時指定接收對象。 class Receiver : public QObject {Q_OBJECT public slots:void handleSignal(int value) { /* ... */ } };// 連接…

學習筆記丨AR≠VR:透視沉浸式技術的“虛實象限”法則

AR&#xff08;增強現實&#xff09;和VR&#xff08;虛擬現實&#xff09;是沉浸式技術的兩大分支&#xff0c;核心區別在于虛擬與現實的融合程度。以下是兩者的詳細對比&#xff1a; 對比維度 AR&#xff08;增強現實&#xff09; VR&#xff08;虛擬現實&#xff09; 技術…

本地使用 modelscope 大模型 來進行文本生成視頻(Text-to-Video)

1. ? 創建并激活 Conda 環境&#xff08;Python 3.8&#xff09; conda create -n modelscope python3.8 -yconda activate modelscope 2.? 安裝了 PyTorch&#xff08;CPU 版本&#xff09; 如果你是 CPU-only 用戶&#xff08;沒有 NVIDIA 顯卡 或不想用 GPU&#xff0…

文生視頻(Text-to-Video)

&#x1f552; 生成時間&#xff1a;每張圖大概 10–60 秒&#xff08;取決于設備&#xff09; ? 二、文生視頻&#xff08;Text-to-Video&#xff09; 以下項目中&#xff0c;很多都基于 SD 模型擴展&#xff0c;但視頻生成復雜度高&#xff0c;生成時間一般 超過 30 秒&am…

CLion + STM32環境配置,親測有效(2025.06.19記)

CLion STM32環境配置 遇到的問題描述&#xff1a; > "moniton" command not supported by this target. > You cant do that when your target is exec > 上傳完成&#xff0c;但存在問題 > monitor reset > "monitor" command not …

借助ChatGPT快速開發圖片轉PDF的Python工具

一、開發背景與適用場景 隨著數字文檔處理需求的激增&#xff0c;圖片轉PDF的需求日益廣泛。從學生提交圖像化作業&#xff0c;到教師整合掃描試卷等資料&#xff0c;再到行政人員歸檔證件照片&#xff0c;工作中的方方面面都離不開圖片的處理。如何高效、批量地將多個圖片文件…

SuGAR代碼精簡解讀

目錄 一、全流程訓練腳本 train_full_pipeline.py 二、核心訓練邏輯 train.py 粗優化 (coarse_density_and_dn_consistency.py) 網格提取 (extract_mesh_from_coarse_sugar) 精優化 (refined_training) 兩次優化&#xff08;粗優化和精優化&#xff09;中使用的損失函數及…

大模型安全關鍵技術研究

? 引言 隨著人工智能技術的迅猛發展&#xff0c;大模型已成為推動各行業變革的核心力量。從智能客服、醫療影像識別到金融風險預測&#xff0c;大模型的應用場景不斷拓展&#xff0c;深刻改變著人們的生產生活方式。大模型已經轉變為AI領域的基礎設施&#xff0c;為解決各種…

java面試題04成員變量和局部變量的區別

成員變量(Member Variable)和局部變量(Local Variable)是面向對象編程中兩種作用域和生命周期不同的變量,主要區別體現在以下幾個方面: 1. 聲明位置 成員變量: 聲明在類內部、方法/構造器/代碼塊外部。 例如: public class Person {// 成員變量(實例變量)private Str…

升級到 .NET 9 分步指南

隨著激動人心的 .Net 9 更新正式發布&#xff0c;漫長的等待終于結束了。它帶來了一些令人驚嘆的特性&#xff0c;例如改進的 LINQ 功能、HybridCache 等等。此外&#xff0c;憑借其卓越的性能提升、更佳的安全性、更完善的協議和更易維護的特性&#xff0c;它必將吸引開發者和…

day30打卡

# 導入模塊 import math print("方式1&#xff1a;使用 import math") print(f"圓周率π的值&#xff1a;{math.pi}") print(f"2的平方根&#xff1a;{math.sqrt(2)}\n") # 導入特定項 from math import pi, sqrt print("方式2&#…

優化數據庫查詢

優化數據庫查詢 在實際開發中,數據庫查詢的性能直接關系到系統響應速度和用戶體驗。尤其在高并發環境下,低效的SQL語句會成為瓶頸,導致系統負載升高,甚至引發宕機。因此,查詢優化是數據庫性能優化中最為關鍵的一環。 為了系統性地理解數據庫查詢優化策略,本節將從SQL語…

【LeetCode#第198題】打家劫舍(一維dp)

198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋。每間房內都藏有一定的現金&#xff0c;影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統&#xff0c;如果兩間相鄰的房屋在同一晚上被小偷闖入&#…

微前端MFE:(React 與 Angular)框架之間的通信方式

在 微前端&#xff08;MFE, Micro Frontends&#xff09; 中使用 CustomEvent 是非常常見的&#xff0c;尤其是在不同子應用&#xff08;Micro Apps&#xff09;之間通信的時候。今天將以React 主應用 ? Angular 子應用 之間的通信進行示例 React 主應用 <-> Angular 子…

408考研逐題詳解:2010年第1題——理解棧的基本操作

2010年第1題 若元素 a&#xff0c;b&#xff0c;c&#xff0c;d&#xff0c;e&#xff0c;f 依次進棧&#xff0c;允許進棧、退棧操作交替進行&#xff0c;但不允許連續三次進行退棧操作&#xff0c;則不可能得到的出棧序列是&#xff08; &#xff09; A. dcebfa \qquad B.…

python追加合并excel效率記錄

第一種合并方法&#xff1a; 在sheet的第一行&#xff0c;追加新表concat舊表 read_excel讀取舊表全部 to_excel新表追加寫入舊表 需要的時間&#xff1a; 第二種合并方法&#xff1a; 在sheet的最后一行&#xff0c;直接追加新表 load_book只讀用來獲取舊表sheet行數 read_ex…

公鑰加密與簽名算法計算詳解(含計算題例子)

一、RSA 加密算法 密鑰生成&#xff1a; 選兩個大素數 p 和 q計算 n p q計算 φ(n) (p-1)(q-1)選整數 e 滿足 1 < e < φ(n) 且 gcd(e, φ(n)) 1計算 d 滿足 d e ≡ 1 mod φ(n) 公鑰&#xff1a;(e, n) 私鑰&#xff1a;(d, n) 加密&#xff1a; c ≡ m? mod…

63 網絡交互的過程中目標設備的選擇

前言 這里主要是 調研一下 發送網絡數據包的過程中 選擇網絡設備 比如 向本機發送信息, 走的是 lo 向局域網其他主機發送信息, 走無線網卡 或者 有線網卡 基于 linux 的調試 這里主要是基于 ping 192.168.1.2 的調試 skb->dev 的初始化是在 skb->_skb_refdst 初…

DE2-115板子上用 Verilog編程實現一個分秒計數器

一、實驗目的 掌握 Verilog 語言在硬件描述中的應用&#xff0c;通過編程實現分秒計數器的邏輯功能。 學習并實踐按鍵消抖的原理與實現方法&#xff0c;提升對硬件電路中信號處理的理解。 熟悉在 DE2-115 開發板上進行 Verilog 程序的開發、調試及下載驗證流程&#xff0c;將…