22. MDI窗口设计

news/2025/1/10 20:01:15/文章来源:https://www.cnblogs.com/FlurryHeart/p/18664614

一、什么是MDI窗口

  MDI 窗口(Multiple-Document Interface),又称多文档界面,它主要用于同时显示多个文档,每个文档显示在各自的窗口中。MDI 窗口中通常包含子菜单和窗口菜单,用于在窗口或文档之间进行切换。

  用 QMainWindow 建立的主界面,通常会同时建立或打开多个相互独立的文档,这些文档共享主界面的菜单、工具栏和停靠控件,多文档中只有一个文档是活跃的文档,菜单和工具栏的操作只针对当前活跃的文档。主界面要实现多文档操作需要用 QMdiArea 控件,通常把 QMdiArea 定义成中心控件。可以在 QMdiArea 控件中添加多个子窗口 QMdiSubWindow,通常每个子窗口都有相同的控件,当然控件也可以不相同。

  我们可以在终端中使用 pip 安装 pyside6 模块。

pip install pyside6

  多文档区 QMdiArea 和子窗口 QMdiSubWindow 的继承关系如下所示:

QMdiArea与QMdiSubWindow的继承关系

  用 QMdiArea 类和 QMdiSubWindow 类创建多文档实例和子窗口实例的方法如下。

QMdiArea(parent:QWidget=None)
QMdiSubWindow(parent:QWidget=None, flags:Qt.WindowFlags=Default(Qt.WindowFlags))

  QMidArea 类常用的方法及其说明如下:

# 实例方法
addSubWindow(widget:QWidget, flags:Qt.WindowFlags=Qt.WindowFlags()) -> QMdiSubWindow                    # 添加子窗口
removeSubWindow(widget:QWidget) -> None                                                                 # 删除子窗口setViewMode(mode:QMdiArea.ViewMode) -> None                                                             # 设置MDI区域的视图模式
viewMode() -> QMdiArea.ViewMode                                                                         # 获取MDI区域的视图模式currentSubWindow() -> QMdiSubWindow                                                                     # 获取当前子窗口scrollContentsBy(dx:int, dy:int) -> None                                                                # 移动子窗口中的控件
setActivationOrder(order:QMdiArea.WindowOrder) -> None                                                  # 设置子窗口的活跃顺序
activationOrder() -> QMdiArea.WindowOrder                                                               # 获取子窗口的活跃顺序
subWindowList(order:QMdiArea.WindowOrder=QMdiArea.WindowOrder.CreationOrder) -> List[QMdiSubWindow]     # 按照指定顺序获取子窗口列表
activeSubWindow() -> QMdiSubWindow                                                                      # 获取活跃的子窗口setBackground(background:Union[QBrush, QColor, Qt.GlobalColor, QGradient]) -> None                      # 设置背景,默认是灰色
background() -> QBrush                                                                                  # 获取背景色画刷
setOption(option:QMdiArea.Option, on:bool=True) -> None                                                 # 设置子窗口选项
testOption(opton:QMdiArea.Option) -> bool                                                               # 获取子窗口是否设置了选项setTabPosition(position:QTabWidget.TabPosition) -> None                                                 # 设置Tab标签的位置
tabPosition() -> QTabWidget.TabPosition                                                                 # 获取Tab标签的位置
setTabShape(shape:QTabWidget.TabShape) -> None                                                          # 设置Tab标签的形状
tabShape() -> QTabWidget.TabShape                                                                       # 获取Tab标签的形状
setTabsClosable(closable:bool) -> None                                                                  # 设置Tab标签是否可关闭
tabsClosable() -> bool                                                                                  # 获取Tab标签是否可关闭
setTabsMovable(movable:bool) -> None                                                                    # 设置Tab标签是否可移动
tabsMovable() -> bool                                                                                   # 获取Tab标签是否可移动
setDocumentMode(enabled:bool) -> None                                                                   # 设置Tab标签是否为文档模式
documentMode() -> bool                                                                                  # 获取Tab标签是否为文档模式# 槽函数
cascadeSubWindows() -> None                                                                             # 层叠显示子窗口
tileSubWindows() -> None                                                                                # 平铺显示子窗口
closeActiveSubWindow() -> None                                                                          # 关闭正在活动状态的子窗口
closeAllSubWindows() -> None                                                                            # 关闭全部子窗口
activatePreviousSubWindow() -> None                                                                     # 激活上一个子窗口
activateNextSubWindow() -> None                                                                         # 激活下一个子窗口
setActiveSubWindow(window:QMdiSubWindow) -> None                                                        # 设置活跃的窗口

  QMidArea 类常用的信号及其说明如下:

subWindowActivated(arg__1:QMdiSubWindow)   # 当子窗口活跃时发射信号

  QMdiSubWindow 类常用的方法及其说明如下:

# 实例方法
setWidget(widget:QWidget) -> None                                       # 设置子窗口的控件
widget() -> QWidget                                                     # 获取子窗口的控件
isShaded() -> bool                                                      # 获取子窗口是否处于只显示标题栏状态
mdiArea() -> QMdiArea                                                   # 返回子窗口所在的多文档区域
setSystemMenu(systemMenu:QMenu) -> None                                 # 设置系统菜单
systemMenu() -> QMenu                                                   # 获取系统菜单
setKeyboardPageStep(step:int) -> None                                   # 设置用键盘的Page键控制子窗口移动或缩放时的步长
keyboardPageStep() -> int                                               # 获取用键盘的Page键控制子窗口移动或缩放时的步长
setKeyboardSingleStep(step:int) -> None                                 # 设置用键盘的方向键控制子窗口移动或缩放时的步长
keyboardSingleStep() -> int                                             # 获取用键盘的方向键控制子窗口移动或缩放时的步长
setOption(option:QMdiSubWindow.SubWindowOption, on:bool=true) -> None   # 设置选项# 槽函数
showShaded() -> None                                                    # 只显示标题
showSystemMenu() -> None                                                # 在标题栏的系统菜单图标下显示系统菜单

  QMdiSubWindow 类常用的信号及其说明如下:

aboutToActivate()                                                       # 当子窗口活跃时发射信号
windowStateChanged(oldState:Qt.WindowState, newState:Qt.WindowState)    # 窗口状态改变时发射信号
import sysfrom PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtWidgets import QMdiArea, QMdiSubWindow
from PySide6.QtWidgets import QLabel
from PySide6.QtWidgets import QMenuBar, QMenu
from PySide6.QtGui import QActionclass MyWidget(QMainWindow):def __init__(self):# 1.调用父类Qwidget类的__init__()方法super().__init__()# 2.调用setupUi()方法初始化页面self.setup_ui()def setup_ui(self):# 1.设置窗口对象大小self.resize(700, 500)# 2.创建MDI窗口self.mdiArea = QMdiArea(self)self.mdiArea.setGeometry(0, 0, 700, 500)# 3.创建菜单栏self.menuBar = QMenuBar(self)self.setMenuBar(self.menuBar)# 4.设置菜单self.menu = QMenu("子窗体操作", self)self.menuBar.addMenu(self.menu)# 5.设置菜单项self.new_action = QAction("新建", self.menu)self.tile_action = QAction("平铺显示", self.menu)self.cascade_action = QAction("级联显示", self.menu)self.menu.addActions([self.new_action, self.tile_action, self.cascade_action])# 6.为菜单关联信号self.menuBar.triggered[QAction].connect(self.action)# 7.记录子窗口的个数self.count = 0def action(self, msg):if msg.text() == "新建":# 创建子窗口对象sub = QMdiSubWindow()self.count += 1# 设置子窗口的标题sub.setWindowTitle(f"子窗口{self.count}")# 在子窗口中添加一个标签,并设置文本label = QLabel(f"这是第{self.count}个子窗口")sub.setWidget(label)self.mdiArea.addSubWindow(sub)sub.show()elif msg.text() == "平铺显示":self.mdiArea.tileSubWindows()elif msg.text() == "级联显示":self.mdiArea.cascadeSubWindows()if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/867296.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解:订单履约系统规划

大家好,我是汤师爷~ 什么是订单履约系统? 订单履约是从消费者下单支付到收到商品的全流程管理过程,包括订单接收、订单派单、库存分配、仓储管理和物流配送等环节,核心目标是确保商品准时、准确地送达消费者手中。 通过订单履约系统,消费者可以实时了解商品的物流状态和预…

文件单独编译生成

编译设备树也最好在 source过的那个窗口中来编译错误提示如下: 同时在makefile文件修改时也要注意

In‐band Network Telemetry

#卫星 #遥测技术 #INT 一、INT是什么? INT,In‐band Network Telemetry ,带内网络遥监测。telemetry,英文原意是遥测技术。从其英文名称可以了解如下: a.In-band,说明监测指令及数据均在带内传输 b.telemetry ,说明是长距离,远程获取网络数据的方法。 想象一下卫星在…

潮汐指纹识别工具 : 在线网站识别利器

最近发现了一个免费在线收集网站信息的工具,感觉挺好用的,给各位推荐下。潮汐在线指纹识别是山东新潮信息技术有限公司安全团队提供的一个免费开源在线网站信息收集工具。 功能亮点: 全面扫描 只需输入目标网站的URL或IP地址,即可获取该网站的标题、中间件、操作系统、域名…

JAVA-Day 11:数组的静态初始化和遍历

数组的静态初始化和遍历 数组静态初始化格式 数组的静态初始化与遍历 完整格式:数据类型 [] 数组名=new 数据类型[]{元素1,元素2,元素3,....} 简化格式:数据类型 [] 数组名={元素1,元素2,元素3,....} []在数组名前后都可以 代码如下: int number[]={1,2,3,4,5};for (int …

JAVA-Day 10:Do...While循环语句

Do...While循环语句 Do...While循环格式 初始化语句; do{ 循环体语句; 条件控制语句; }while(条件判断语句); 例: 使用do...while循环输出1-10的和(包括10) int i=1;int count=0;do{count+=i;i++;}while(i<=10);System.out.println(count);代码运行结果如下图所示:

配置tigerVNC,登陆远程服务器

1.在远程服务器安装、配置 (1) sudo apt update sudo apt install xfce4 xfce4-goodies (2) 安装TigerVNC sudo apt install tigervnc-standalone-server (3) 配置vnc vncpasswd (4) 配置.vnc: vim ~/.vnc/xstartup 添加:cat .vnc/xstartup#!/bin/sh # 启动 D-Bus 会话 (如果未…

CF1993F2 Dyn-scripted Robot (Hard Version)

Dyn-scripted Robot (Hard Version) 题目链接。 Problem Easy Version:\(K \le n\)。 Hard Version:\(K \le 10^{12}\)。 一个 \(Oxy\) 平面上有一个 \(w \times h\) 矩形,矩形的左下方有点 \((0, 0)\) ,右上方有点 \((w, h)\) 。 您还有一个最初位于点 \((0, 0)\) 的机器人…

OmniNxt 论文阅读

来源: https://arxiv.org/html/2403.20085?_immersive_translate_auto_translate=1 标题: OmniNxt: A Fully Open-source and Compact Aerial Robot with Omnidirectional Visual Perception OmniNxt 感觉是, 取自 Omnidirectional 中 全的意思, Nxt 像是 Next 的意思,表…

2024-12-1-#{}与¥{}的区别-response

{}与¥{}的区别response实现重定向response响应字符数据response响应字节数据以及导入工具类实现响应

手动部署前后端分离的项目到本地

1.准备工作 使用maven打包springboot项目为.jar文件得到springboot-0.0.1-SNAPSHOT.jar打包vue项目 npm install -g @vue/cli安装Vue CLI 在项目根目录下,运行npm run build命令来构建项目得到一个dist文件夹将打包好的文件通过远程仓库中转至docker虚拟机在虚拟机拉取镜像,并…

nvm 安装进行node多版本管理及环境变量配置

注意: 1、安装nvm之前需要卸载之前的nodejs,并且还要删除之前的环境变量配置,否则会出现一些奇怪的问题 2、nvm的安装路径不能有中文或者空格,否则后面在cmd中切换node版本会出现乱码 一、完全卸载旧的nodejs 参考文章《Node卸载超详细步骤》 1、打开系统的控制面板,点击卸…