PyQt5高级窗口控件详解:停靠窗口、多文档界面与滚动条

掌握PyQt5的高级窗口控件,让你的GUI应用具备专业级的布局与交互体验

在PyQt5应用开发中,高效管理窗口布局和实现复杂交互功能是提升用户体验的关键。本文将深入解析三个核心高级控件:停靠窗口(QDockWidget)、多文档界面(MDI)和滚动条(QScrollBar),通过代码示例带你快速掌握它们的实战应用。

QDockWidget:灵活可停靠的窗口控件

QDockWidget是PyQt5中用于创建可停靠子窗口的核心控件,它可以在主窗口内自由浮动或停靠在指定区域,为专业级应用提供灵活的布局方案。

方法描述
setWidget()在Dock囗区域设置QWidget
setFloating()设置Dock窗口是否可以浮动,如果设置为True,则表示可以浮动
setAllowedAreas()设置窗口可以停靠的区域:LeftDockWidgetArea,左边停靠区域;RightDockWidgetArea,右边停靠区域;TopDockWidgetArea,顶品停靠区域;BottomDockWidgetArea,部停靠区域;NoDockWidgetArea,不显示Widget;
setFeatures()设置停靠窗口的功能属性:DockWidgetClosable,可关闭;DockWidgetMovable,可移动;DockWidgetFloatabIe,可漂浮;DockWidgetVcrticaITitIeBar,在左边显示垂直的标签栏;AllDockWidgetFeatures,具有前三种属性的所有功能;NoDockWidgetFeatures,无法关团,不能移动,不能漂浮;

QDockWidget的使用

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *class DockDemo(QMainWindow):def __init__(self,parent=None):super(DockDemo,self).__init__(parent)layout=QHBoxLayout()bar=self.menuBar()file=bar.addMenu("File")file.addAction("New")file.addAction("save")file.addAction("quit")self.items=QDockWidget("Dockable",self)self.listWidget=QListWidget()self.listWidget.addItem("item1")self.listWidget.addItem("item2")self.listWidget.addItem("item3")self.items.setWidget(self.listWidget)self.items.setFloating(False)self.setCentralWidget(QTextEdit())self.addDockWidget(Qt.RightDockWidgetArea,self.items)self.setLayout(layout)self.setWindowTitle("Dock 例子")if __name__ == '__main__':app=QApplication(sys.argv)demo=DockDemo()demo.show()sys.exit(app.exec_())

运行结果

VeryCapture_20250522221236

MDI多文档界面:高效管理多个子窗口

MDI(Multiple Document Interface)允许在单个主窗口容器内管理多个文档窗口,相比独立的SDI窗口,它能显著节省系统资源并提供更集成的用户体验。

QMdiArea核心方法

一个典型的GUI应用程序可能有多个窗口,选项卡控件和堆栈窗口控件允许一
次使用其中的一个窗口。然而,很多时候这种方法不是很有用,因为其他窗口的视
图是隐藏的。

一种同时显示多个窗口的方法是,创建多个独立的窗口,这些独立的窗口被称
为SDI(SingleDocumentlnterface,单文档界面),每个窗口都可以有自己的菜单系
统、工具栏等。这需要占用较多的内存资源。

MDI(Multiple Document lnterface,多文档界面)应用程序占用较少的内存资
源,子窗口都可以放在主窗口容器中,这个容器控件被称为QMdiArea。

QMidArea控件通常占据在QMainWindow对象的中央位置,了窗口在这个区域
是QMdiSubWindow类的实例,可以设置任何QWidget作为子窗口对象的内部控件,
子窗口在MDI区域进行级联排列布局。

QMdiArea类和QMdiSubWindow类中的常用方法如表5-16所示。

方法描述
addSubWindow()将一个小控件添加在MDI区域作为一个新的子窗囗
removeSubWindow()删除一个子窗囗中的小控件
setActiveSubWindow()激活一个子窗口
caseadeSubWindows()安排子窗口在MDI区域级联显示
tileSubWindows()安排子窗口在MDI区域平铺显示
closeActiveSubWindow()关闭活动的子窗口
subWindowList()返回MDI区域的子窗口列表
setWidget()设置一个小控件作为QMdiSubwindow实例对象的内部件

多重文档界面

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *class MainWindow(QMainWindow):count=0def __init__(self,parent=None):super(MainWindow,self).__init__(parent)self.mdi=QMdiArea()self.setCentralWidget(self.mdi)bar=self.menuBar()file=bar.addMenu("File")file.addAction("New")file.addAction("cascade")file.addAction("Tiled")file.triggered[QAction].connect(self.windowaction)self.setWindowTitle("MDI demo")def windowaction(self,q):print("triggered")if q.text()=="New":MainWindow.count=MainWindow.count+1sub=QMdiSubWindow()sub.setWidget(QTextEdit())sub.setWindowTitle("subwindow"+str(MainWindow.count))self.mdi.addSubWindow(sub)sub.show()if q.text()=="cascade":self.mdi.cascadeSubWindows()if q.text()=="Tiled":self.mdi.tileSubWindows()if __name__ == '__main__':app=QApplication(sys.argv)demo=MainWindow()demo.show()sys.exit(app.exec_())

运行结果

VeryCapture_20250522225618

QScrollBar:实现精确的滚动控制

QScrollBar不仅提供基本的滚动功能,还能作为交互式控件用于数值调整,特别适合需要精确控制的场景(如颜色选择器)。

核心信号说明

方法描述
valueChanged当滑动条的值改变时发射此信号
sliderMoved当用户拖动滑块时发射此信号

QScrollBar

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *class Example(QWidget):def __init__(self):super(Example,self).__init__()self.initUI()def initUI(self):hbox=QHBoxLayout()self.l1=QLabel("拖动滑动条去改变颜色")self.l1.setFont(QFont("Arial",16))hbox.addWidget(self.l1)self.s1=QScrollBar()self.s1.setMaximum(255)self.s1.sliderMoved.connect(self.sliderval)self.s2=QScrollBar()self.s2.setMaximum(255)self.s2.sliderMoved.connect(self.sliderval)self.s3=QScrollBar()self.s3.setMaximum(255)self.s3.sliderMoved.connect(self.sliderval)hbox.addWidget(self.s1)hbox.addWidget(self.s2)self.setGeometry(300,300,300,200)self.setWindowTitle("QScrollBar 例子")self.setLayout(hbox)def sliderval(self):print(self.s1.value(),self.s2.value(),self.s3.value())palette=QPalette()c=QColor(self.s1.value(),self.s2.value(),self.s2.value(),255)palette.setColor(QPalette.Foreground,c)self.l1.setPalette(palette)if __name__ == '__main__':app=QApplication(sys.argv)demo=Example()demo.show()sys.exit(app.exec_())

运行效果

VeryCapture_20250522231305
代码分析:
在这个例了中,设置了三个滑动条来控制标签中所显示文字的字体颜色的RGB
值。
当移动滑块时,将sliderMoved信号与槽函数sliderval()连接起来。

总结:高级控件的应用场景

PyQt5中的高级窗口控件为开发专业级GUI应用提供了强大支持:

  • QDockWidget - 适用于需要灵活布局的开发环境(如IDE、图形设计软件)

  • MDI界面 - 适合多文档处理应用(如文本编辑器、电子表格、CAD软件)

  • QScrollBar - 不仅实现滚动功能,还可用于创建自定义控制面板(如调色板、参数调节器)

掌握这些控件的高级用法,能够显著提升应用的用户体验和专业感。建议在实际项目中根据具体需求组合使用这些控件,构建出既美观又高效的GUI界面。

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

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

相关文章

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | DrawingApp(画板组件)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— DrawingApp组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API&#xff08;<script setup>…

Eureka、Nacos、LoadBalance、OpenFeign​之间的区别联系和协作 (附代码讲解)

这篇文章聊聊微服务里的这几个老伙计&#xff1a;Eureka、Nacos、LoadBalance、OpenFeign。咱们做微服务开发&#xff0c;总会跟这几个组件打交道&#xff1a;Eureka、Nacos、Spring Cloud LoadBalancer、OpenFeign。它们各司其职又互相配合&#xff0c;今天就把它们的关系、用…

JavaSE-继承

继承&#xff08;inheritance&#xff09;继承的意义我们首先来看下面两个类&#xff1a;public class Dog {public String name;public int age;public void eat(){System.out.println(this.name"正在吃饭");}public void bark(){System.out.println(this.name"…

第二届虚拟现实、图像和信号处理国际学术会议(VRISP 2025)

重要信息 官网&#xff1a;www.icvisp.net 时间&#xff1a;2025年8月1-3日 地点&#xff1a;中国-长沙 简介 近年来&#xff0c;虚拟现实技术取得了显著进步&#xff0c;与5G、云计算和物联网等新一代信息技术的融合加速&#xff0c;推动了其在硬件、软件和内容应用等方面…

SpringBoot+Mybatis+MySQL+Vue+ElementUI前后端分离版:整体布局、架构调整(二)

目录 一、前言 二、后端调整 1.实体类调整 2.菜单相关接口 3.用户相关接口 4.新增工具类 5.新增菜单树返回类 6.配置类、拦截器 三、前端调整 1.请求调整 2.页面布局、样式调整 1.user.vue 2.index.vue 3.请求拦截 四、开发过程中的问题 五、附&#xff1a…

vue3官方文档学习心得

这几天抽空把vue3的文档整个看了一遍。简介 | Vue.js 23年写过一个vue2的项目&#xff0c;24年写了一个vue3的项目&#xff0c;页面功能比较简单&#xff0c;用几个简单的API&#xff0c;watch、watchEffect、ref、reactive就能实现的业务功能。 写了几年的react的&#xff0…

Pycharm恢复默认设置,配置导致复制粘贴等不能使用

在file 种找到manage IDE settings在manage IDE settings中找到restore default settings

【王树森推荐系统】召回12:曝光过滤 Bloom Filter

概述 曝光过滤通常是在召回阶段做&#xff0c;具体的方法就是用 Bloom Filter 曝光过滤问题 如果用户看过某个物品&#xff0c;则不再把该物品曝光给用户。原因是同一个物品重复曝光给用户会损害用户体验&#xff0c;但也不是所有推荐系统都有曝光过滤&#xff0c;像 youtube 这…

基于STM32单片机的心率血氧监测系统设计(STM32代码编写+手机APP设计+PCB设计+Proteus仿真)

系列文章目录 文章目录 系列文章目录前言1 资料获取与演示视频1.1 资料介绍1.2 资料获取1.3 演示视频 2 系统框架3 硬件3.1 主控制器3.2 显示屏3.3 WIFI模块3.4心率血氧传感器 4 设计PCB4.1 安装下载立创EDA专业版4.2 画原理图4.4 使用嘉立创下单助手进行下单&#xff0c;打板。…

main(int argc,char **agrv)的含义

今天和大家讨论一个常见的但是不容易深入了解的知识点。那就是 main 函数声明中使用到的 argc 和 argv 的含义。通常我们写主函数的时候一般都是直接使用int main() 或者 void main() 来声明 main 函数。但是你知道吗&#xff1f;在c89/c99的语言标准中&#xff0c;main函数的声…

如何简单实现发版不影响客户使用?nginx负载

nginx负载发版不影响客户使用 1.需要二台服务器 2.二台服务器均是正式环境配置 3.服务器Nginx配置修改 发版顺序&#xff1a;先在服务器2发版&#xff0c;发布成功后&#xff0c;再改服务器Nginx配置&#xff0c;重新加载nginx&#xff1b;然后在服务器再发版&#xff0c;发布成…

qt笔记(1)——Qtablewidget使用

1.基础使用方法 &#xff08;略&#xff09; 2.坑和注意点 2.1 设置一个单元格的编辑属性 在代码中&#xff0c;想要修改一个单元格的编辑属性&#xff0c;需要对这个item的flags进行设置&#xff1b;注意对一个tablewidget的一个item成员进行设置后&#xff0c;进行一次编…

字符串的模糊匹配方法介绍

字符串的模糊匹配方法介绍 目录字符串的模糊匹配方法介绍一、编辑距离&#xff08;Levenshtein Distance&#xff09;复杂度分析二、Jaro-Winkler 距离复杂度分析三、最长公共子序列&#xff08;LCS&#xff09;复杂度分析四、模糊搜索&#xff08;Fuzzy Search&#xff09;复杂…

ActiveMQ在Spring Boot中的详细使用指南

📋 目录 🚀 ActiveMQ简介 什么是ActiveMQ? 核心概念 🏗️ 基础架构组件 📝 重要概念解释 ActiveMQ vs 其他消息中间件 🔧 环境搭建 1. ActiveMQ服务端安装 Docker方式(推荐初学者) 手动安装方式 2. 验证安装 访问Web管理界面 连接参数 测试连接 �…

二元一次方程

前言 最近刚学二元一次方程&#xff0c;想写一篇专栏熟悉一下本文写给初一的同学看&#xff0c;学过的就划了吧二元一次方程 两个未知数最高项次数为 111 次为整式方程二元一次方程的解不唯一&#xff0c;但是二元一次方程可以用一个未知数来表达另一个未知数eg:eg:eg: xy1x y…

AI编程的未来是智能体原生开发?

目录 前言 一、从“串行”到“并行”&#xff1a;什么是智能体原生开发&#xff1f; 1.1 传统模式&#xff08;串行思维&#xff09; 1.2 智能体原生模式&#xff08;并行思维&#xff09; 二、程序员的新角色&#xff1a;从代码手艺人到系统思想家 三、软件开发的终局&a…

【牛客刷题】小红的与运算

文章目录 一、题目介绍1.1 题目描述1.2 输入描述1.3 输出描述1.4 示例二、 解题思路2.1 核心算法设计2.2 性能优化关键2.3 算法流程图三、解法实现3.1 解法一:基础实现3.1.1 初级版本分析3.2 解法二:优化版本(推荐)3.2.1 优化版本分析四、总结与拓展4.1 关键优化技术4.2 算…

spring中 方法上@Transation实现原理

Spring中Transactional注解方法实现原理Spring的Transactional注解在方法级别实现事务管理的原理主要基于动态代理和拦截器机制&#xff0c;以下是其核心实现流程&#xff1a;1. 代理创建阶段当Spring容器启动时&#xff0c;会为带有Transactional注解的类创建代理对象&#xf…

qt-C++语法笔记之Stretch与Spacer的关系分析

qt-C语法笔记之Stretch与Spacer的关系分析 code review! 文章目录qt-C语法笔记之Stretch与Spacer的关系分析1. Stretch&#xff08;拉伸因子&#xff09;2. Horizontal Spacer 和 Vertical Spacer3. Stretch 和 Spacer 的关系4. 实际应用中的选择5. 注意事项6. 代码与 Qt Desig…

Qwen3技术综述

1. 引入 2025年5月&#xff0c;qwen推出了旗舰模型&#xff08;flagship model&#xff09;Qwen3-235B-A22B。并以Apache 2.0版权发布&#xff08;可自由商业使用&#xff0c;修改代码和商用要包含原始版权&#xff09;。本文对其技术报告中提到的数据处理技术与模型结构进行综…