掌握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_())
运行结果
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_())
运行结果
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_())
运行效果
代码分析:
在这个例了中,设置了三个滑动条来控制标签中所显示文字的字体颜色的RGB
值。
当移动滑块时,将sliderMoved信号与槽函数sliderval()连接起来。
总结:高级控件的应用场景
PyQt5中的高级窗口控件为开发专业级GUI应用提供了强大支持:
-
QDockWidget - 适用于需要灵活布局的开发环境(如IDE、图形设计软件)
-
MDI界面 - 适合多文档处理应用(如文本编辑器、电子表格、CAD软件)
-
QScrollBar - 不仅实现滚动功能,还可用于创建自定义控制面板(如调色板、参数调节器)
掌握这些控件的高级用法,能够显著提升应用的用户体验和专业感。建议在实际项目中根据具体需求组合使用这些控件,构建出既美观又高效的GUI界面。