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.区别

特性WindowApplicationWindow
功能定位轻量级基础容器完整应用框架
内置组件❌ 无标题栏/菜单栏✅ 支持菜单栏/工具栏/状态栏
内容管理手动布局子元素提供 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核心属性与方法

组件属性/方法类型说明示例
menuBardelegateComponent自定义菜单项渲染模板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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;将…