一、主窗口控件
之前,我们使用可视控件创建具体的实例时都选择了一个父窗体,将控件放到这个窗体上,即使在创建实例时没有选择父窗体,也可以用控件的 setParent()
方法将控件放到父窗体上。如果一个控件没有放到任何窗体上,则这个控件可以单独成为窗口,并且可以作为父窗口来使用,可在其上面添加其他控件,这种控件可以称为程序的独立窗口(independent widget)。
QWidget 可以当作普通的容器控件使用,也可以当作独立的窗口来使用。当一个控件有父窗口时,不显示该控件的标题栏;当控件没有父窗口时,会显示标题栏。
QMainWindow 窗口与 QWidget 窗口的最大区别在于窗口上的控件和控件的布局。QMainWindow 窗口通常当作主窗口使用,在它上面除了可以添加菜单栏、工具栏、状态栏外,还可以建立可浮动和可停靠的窗口(QDockWidget)、中心控件(CentralWidget)、多文档区(QMdiArea)和子窗口(QMdiSubWindow)。
QMainWindow窗口的布局如下所示:
一般在顶部放置菜单栏,在底部放置状态栏,在中心位置放置一个控件,控件类型任意,在中心控件的四周可以放置可停靠控件 QDockWidget,在可停靠控件的四周是工具栏放置区。需要注意的是,QMainWindow 窗口需要有个中心控件。 QMainWindow 的中心窗口可以是单窗口,也可以是多窗口,多窗口需要把 QMdiArea 控件作为中心控件。中心控件为主显示区,工具栏和可停靠控件可以用鼠标进行拖拽、悬浮和停靠操作。
我们可以在终端中使用 pip 安装 pyside 模块。
pip install pyside6
QMainWindow 主窗口是从 QWidget 类继承而来的。用 QMainWindow 创建主窗口实例的方法如下所示,其中参数 parent 通常不用设置,当作独立窗口使用。
QMainWindow(parent:QWidget=None)
QMainWindow(parent:QWidget=None, flags:Qt.WindowFlags=Default(Qt.WindowFlags))
主窗口 QMainWindow 的方法主要针对中心控件、菜单栏、状态栏、停靠控件、工具栏进行设置,主要方法介绍如下。
# 实例方法
setCentralWidget(widget:QWidget) -> None # 设置中心控件
centralWidget() -> QWidget # 获取中心控件
takeCentralWidget() -> QWidget # 移除中心控件setMenuBar(menubar:QMenuBar) -> None # 设置菜单栏
menuBar() -> QMenuBar # 获取菜单栏
setMenuWidget(menubar:QWidget) -> None # 设置菜单栏控件
menuWidget() -> QWidget # 获取菜单栏控件
createPopupMenu() -> QMenu # 创建弹出菜单setStatusBar(statusbar:QStatusBar) -> None # 设置状态栏
statusBar() -> QStatusBar # 获取状态栏addToolBar(title:str) -> QToolBar # 添加工具栏,并返回新创建的工具栏
addToolBar(toolbar:QToolBar) -> None # 在顶部添加工具栏
addToolBar(area:Qt.ToolBarArea, toolbar:QToolBar) -> None # 在指定区域添加工具栏
insertToolBar(before:QToolBar, toolbar:QToolBar) -> None # 在第一个工具条前插入工具条
removeToolBar(toolbar:QToolBar) -> None # 移除工具栏addToolBarBreak(area:Qt.ToolBarArea=Qt.TopToolBarArea) -> None # 添加工具条放置区域,两个工具栏可以并排或者并列显示
insertToolBarBreak(before:QToolBar) -> None # 在指定工具栏前插入工具栏放置区域
removeToolBarBreak(before:QToolBar) -> None # 移除工具栏前插入放置区域toolBarArea(toolbar:QToolBar) -> Qt.ToolBarArea # 获取工具栏的停靠区
toolBarBreak(toolbar:QToolBar) -> bool # 获取工具栏是否分割setToolButtonStyle(toolButtonStyle:Qt.ToolButtonStyle) -> None # 设置工具栏按钮样式
toolButtonStyle() -> Qt.ToolButtonStyle # 获取工具栏按钮样式addDockWidget(area:Qt.DockWidgetArea, dockwidget:QDockWidget) -> None # 在指定停靠区域添加停靠控件
addDockWidget(area:Qt.DockWidgetArea, dockwidget:QDockWidget, orientation:Qt.Orientation) -> None # 在指定停靠区域添加停靠控件,并指定停靠方向
removeDockWidget(dockwidget:QDockWidget) -> bool # 移除停靠控件
dockWidgetArea(dockwidget:QDockWidget) -> Qt.DockWidgetArea # 获取停靠控件的停靠区域
isDockNestingEnabled() -> bool # 获取停靠区是否可放一个控件restoreDockWidget(dockwidget:QDockWidget) -> bool # 恢复停靠控件
restoreState(state:QByteArray, version:int=0) -> bool # 恢复停靠控件的状态
saveState(version:int=0) -> QByteArray # 保存停靠控件的状态isAnimated() -> bool # 获取停靠控件是否使用动画效果setCorner(corner:Qt.Corner, area:Qt.DockWidgetArea) -> None # 设置某个角落属于停靠区的哪一部分
corner(corner:Qt.Corner) -> Qt.DockWidgetArea # 获取某个角落属于停靠区的哪一部分setDocumentMode(enabled:bool) -> None # 设置Tab标签是否是文档模式
documentMode() -> bool # 获取Tab标签是否是文档模式setIconSize(iconSize:QSize) -> None # 设置Tab标签的图标大小
iconSize() -> QSize # 获取Tab标签的图标大小setTabPosition(areas:Qt.DockWidgetArea, tabPosition:Qt.TabPosition) -> None # 多个停靠控件重叠时,设置Tab标签的位置,默认在底部
setTabShape(tabShape:Qt.TabShape) -> None # 多个停靠控件重叠时,设置Tab标签的形状splitDockWidget(after:QDockWidget, dockwidget:QDockWidget, orientation:Qt.Orientation) -> None # 将被挡住的停靠控件分为两部分tabifyDockWidget(first:QDockWidget, second:QDockWidget) -> None # 将第二个停靠控件放在第一个停靠控件的上部,通常创建停靠控件
tabifiedDockWidgets(dockwidget:QDockWidget) -> List[QDockWidget] # 获取停靠区中停靠控件列表# 槽方法
setDockNestingEnabled(enabled:bool) -> None # 设置停靠区是否可容纳多个控件
setAnimated(enabled:bool) -> None # 设置停靠控件是否使用动画效果
主窗口 QMainWindow 的常用信号如下:
iconSizeChanged(iconSize:QSize) # 当工具栏按钮的尺寸发生变化时发射信号
tabifiedDockWidgetActivated(dockWidget:QDockWidget) # 重叠的停靠控件激活时发射信号
toolButtonStyleChanged(toolButtonStyle:Qt.ToolButtonStyle) # 当工具栏按钮的样式发生变化时发射信号
二、菜单和动作
一般菜单栏由多个菜单构成,菜单下面又有动作、子菜单和分隔条,子菜单下面又有动作,还可以有子菜单,动作上有图标和快捷键。
建立一个菜单分为 3 步。
- 需要建立放置菜单的容器,即菜单栏;
- 在菜单栏上添加菜单,或者在菜单上添加子菜单;
- 在菜单栏、菜单或子菜单下面添加动作,并为动作编写槽函数。
菜单一般不执行命令,其作用类似于标签,只有动作才可以发送信号,执行关联的槽函数。
2.1、菜单栏
QMenuBar
类是所有窗口的菜单栏,用户需要再次基础上添加不同的 QMenu 和 QAction 类,创建菜单栏有两种方法,分别是 QMenuBar 类的构造方法 和 QMainWindow 对象的 menuBar() 方法。
menuBar = QMenuBar(parent:QWidget=None)
或
menuBar = mainWindow.menuBar()
QMenuBar 类的常用方法如下:
addMenu(menu:QMenu) -> QAction # 添加已经存在的菜单
addMenu(title:str) -> QMenu # 用字符串添加菜单,并返回菜单
addMenu(icon:QIcon, title:str) -> QMenu # 用图标和字符串添加菜单,并返回菜单
addAction(action:QAction) -> None # 添加已经存在的动作
addAction(text:str) -> QAction # 用字符串添加动作,并返回动作
insertMenu(before:QAction, menu:QMenu) -> QAction # 在指定的动作之前插入菜单
addSeparator() -> QAction # 添加分隔符
insertSeparator(before:QAction) -> QAction # 在指定的动作之前插入分隔符
clear() -> None # 清空菜单
setCornerWidget(w:QWidget, corner:Qt.Corner=Qt.TopRightCorner) -> None # 在菜单栏的角落位置添加控件
cornerWidget(corner:Qt.Corner=Qt.TopRightCorner) -> QWidget # 获取角落位置的控件
setActiveAction(action:QAction) -> None # 设置高亮显示的动作
actionAt(arg__1:QPoint) -> QAction # 获取指定位置的动作
actionGeometry(arg__1:QAction) -> QRect # 获取动作的矩形
菜单栏上可以添加菜单、动作和分隔条,用 addMenu(QMenu)
方法和 addAction(QAction)
方法可以添加已经提前定义好的菜单和动作;用 addMenu(str)
方法和 addMenu(QIcon,str)
方法可以创建并添加菜单,并返回新建立的菜单;用 addAction(str)
方法可以用字符串创建并添加动作,并返回动作;用 setCornerWidget(QWidget,Qt.Corner=Qt.TopRightCorner)
方法可以在菜单栏的角落位置添加控件,位置可取值如下:
Qt.TopLeftCorner
Qt.TopRightCorner
Qt.BottomLeftCorner
Qt.BottomRightCorner
QMenuBar 类的常用信号如下:
hovered(action:QAction) # 当光标划过控件时发射信号
triggered(action:QAction) # 当单击菜单栏上的菜单或动作时发射信号
2.2、菜单
菜单 QMenu 用于放置动作和子菜单,通常将动作分类放到不同的菜单中。菜单 QMenu 继承自 QWidget。用 QMenu 类创建菜单实例的方法如下所示:
QMenu(parent:QWidget=None)
QMenu(title:str, parent:QWidget=None)
QMenu 类表示菜单栏中的菜单,可以显示文本和图标,但是并不负责执行操作,类似于 QLable 的作用。
QMenu 类的常用方法如下:
# 实例方法
addMenu(menu:QMenu) -> QAction # 在菜单中添加子菜单
addMenu(title:str) -> QMenu # 在菜单中添加新子菜单
addMenu(icon:QIcon, title:str) -> QMenu # 在菜单中添加新子菜单
insertMenu(before:QAction, menu:QMenu) -> QAction # 在指定的动作之前插入菜单addAction(action:QAction) -> None # 在菜单中添加已经存在的动作
addAction(text:str) -> QAction # 在菜单中添加新动作
addAction(icon:QIcon, title:str) -> QAction # 在菜单中添加新动作addSeparator() -> QAction # 添加分隔符
addSection(text:str) -> QAction # 添加分隔符
addSection(icon:QIcon, text:str) -> QAction # 添加分隔符
insertSeparator(before:QAction) -> QAction # 在指定的动作之前插入分隔符
insertSection(before:QAction, text:str) -> QAction # 在指定的动作之前插入分隔符
insertSection(before:QAction, icon:QIcon, text:str) -> QAction # 在指定的动作之前插入分隔符
removeAction(action:QAction) -> None # 从菜单中删除动作clear() -> None # 清空菜单
actions() -> List[QAction] # 获取动作列表
isEmpty() -> bool # 判断菜单是否为空
actionAt(arg__1:int) -> QAction # 获取指定位置的动作
columnCount() -> int # 获取列数
menuAction() -> QAction # 获取菜单动作setSeparatorsCollapsible(collapse:bool) -> None # 设置是否可以折叠分隔符
setTearOffEnabled(arg__1:bool) -> None # 设置是否可以拖动分隔符
showTearOffMenu() -> None # 以拖动方式显示菜单
showTearOffMenu(pos:QPoint) -> None # 以拖动方式显示菜单
hideTearOffMenu() -> None # 隐藏拖动菜单
isTearOffEnabled() -> bool # 判断是否可以拖动分隔符
isTearOffMenuVisible() -> bool # 判断是否显示拖动菜单setTitle(title:str) -> None # 设置菜单标题
title() -> str # 获取菜单标题
setIcon(icon:QIcon) -> None # 设置菜单图标
icon() -> QIcon # 获取菜单图标setActiveAction(action:QAction) -> None # 设置活跃的动作高亮显示
activeAction() -> QAction # 获取活跃的动作
setDefaultAction(arg__1:QAction) -> None # 设置默认动作
defaultAction() -> QAction # 获取默认动作popup(pos:QPoint, at:QAction=None) -> None # 弹出菜单# 静态方法
exec(actions:Sequence[QAction], pos:QPoint, at:QAction=None, parent:QWidget=None) # 在指定位置显示菜单,当pos无法确定位置时,用父控件的parent辅助确定位置
QMenu 类常用的信号及其说明如下:
aboutToHide() # 窗口即将隐藏时发射信号
aboutToShow() # 窗口即将显示时发射信号
hovered(action:QAction) # 鼠标悬停时发射信号
triggered(action:QAction) # 鼠标单击时发射信号
2.3、动作
动作 QAction 是定义菜单和工具栏的基础,单击菜单或工具栏上的动作可以触发动作的 triggered() 信号,执行动作关联的槽函数,完成需要完成的工作。动作在菜单中以项(item)的形式显示,在工具栏中以按钮的形式显示。
动作 QAction 继承自 QObject,位于 QtGui 模块中。用 QAction创建动作对象的方法如下所示:
QAction(parent:QObject=None)
QAction(text:str, parent:QObject=None)
QAction(icon:Union[QIcon, QPixmap], text:str, parent:QObject=None)
其中 parent 通常是 窗口、工具栏、菜单栏 或 菜单;text 是 显示的文字,如果将动作放到菜单或工具栏上,text将成为菜单或工具栏中按钮的文字;icon 是 图标,将成为菜单或工具栏中按钮的图标。
QAction 类的常用方法如下:
# 实例方法
setText(text:str) -> None # 设置菜单项文本
text() -> str # 获取菜单项文本
setIcon(icon:QIcon) -> None # 设置菜单项的图标
icon() -> QIcon # 获取菜单项图标
setIconVisibleInMenu(visible:bool) -> None # 设置图标是否显示在菜单中
isIconVisibleInMenu() -> bool # 获取图标是否显示在菜单中
setData(var:Any) -> None # 设置菜单项数据
data() -> Any # 获取菜单项数据setToolTip(tip:str) -> None # 设置菜单项提示
setStatusTip(statusTip:str) -> None # 设置状态提示
setWhatsThis(what:str) -> None # 设置按Shift+F1键时的提示setCheckable(arg__1:bool) -> None # 设置菜单项是否可选
isCheckable() -> bool # 获取菜单项是否可选
isChecked() -> bool # 获取菜单项是否选中
isEnabled() -> bool # 获取菜单项是否可用
isVisible() -> bool # 获取菜单项是否可见setShortcutVisibleInContextMenu(show:bool) -> None # 设置快捷键是否显示在右键菜单中
setShortcuts(arg__1:QKeySequence) -> None # 设置快捷键
setShortcuts(shortcuts:QKeySequence.StandardKey) # 设置快捷键setFont(font:QFont) -> None # 设置菜单项字体
font() -> QFont # 获取菜单项字体
setMenu(arg__1:QMenu) -> None # 设置菜单项的子菜单
menu() -> QMenu # 获取菜单项的子菜单setActionGroup(group:QActionGroup) -> None # 设置菜单项的动作组setSeparator(b:bool) -> None # 设置菜单项是否为分隔符setAutoRepeat(arg__1:bool) -> None # 设置菜单项是否自动重复
autoRepeat() -> bool # 获取菜单项是否自动重复# 槽方法
setChecked(arg__1:bool) -> None # 设置菜单项是否选中
setEnabled(arg__1:bool) -> None # 设置菜单项是否可用
setDisabled(b:bool) -> None # 设置菜单项是否失效
setVisible(arg__1:bool) -> None # 设置菜单项是否可见
resetEnabled() -> None # 重置菜单项是否可用
hover() -> None # 发送hover()信号
trigger() -> None # 发送tigger(bool)信号
toggle() -> None # 发送toggle(bool)信号
QAction 类常用信号及其说明如下:
changed() # 改变时发射信号
checkableChanged(checkable:bool) # 可选状态改变时发射信号
enabledChanged(enabled:bool) # 启用状态改变时发射信号
hovered() # 鼠标悬停时发射信号
toggled(arg__1:bool) # 状态翻转时发射信号
triggered(checked:bool=false) # 鼠标单击时发射信号
visibleChanged() # 可见状态改变时发射信号
import sysfrom PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtWidgets import QMenuBar, QMenu
from PySide6.QtWidgets import QMessageBox
from PySide6.QtGui import QAction, QPixmapclass 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.1.创建一个菜单栏menuBar = QMenuBar(self)# 2.2.将菜单栏添加到窗口中self.setMenuBar(menuBar)# 3.1.添加文件菜单file_menu = QMenu()# 3.2.设置文件菜单的文本file_menu.setTitle("文件")# 3.3.将文本菜单添加到菜单栏中menuBar.addMenu(file_menu)# 4.1.添加编辑菜单,并设置文本edit_menu = QMenu("编辑")# 4.2.将编辑菜单添加到菜单栏中menuBar.addMenu(edit_menu)# 5.1.为文件菜单项添加新建菜单new_action = QAction(menuBar)# 5.2.设置菜单项是否可用new_action.setEnabled(True)# 5.3.设置菜单项文本new_action.setText("新建(&N)")# 5.4.设置菜单项快捷键new_action.setShortcut("Ctrl+N")# 5.5.设置打开菜单项的图标new_action.setIcon(QPixmap("new.ico"))# 5.6.将新建菜单项添加到文件菜单中file_menu.addAction(new_action)# 6.添加间隔线file_menu.addSeparator()# 7.1.为文件菜单项添加打开菜单,并设置文本和图标open_action = QAction(QPixmap("open.ico"), "打开(&O)", file_menu)# 7.2.设置打开菜单项的快捷键open_action.setShortcut("Ctrl+O")# 7.3.将打开菜单项添加到文件菜单中file_menu.addAction(open_action)# 8.打开菜单绑定triggered信号menuBar.triggered.connect(self.get_menu)def get_menu(self, menu):QMessageBox.information(self, "提示信息", f"你选择的是{menu.text()}", QMessageBox.StandardButton.Ok)if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())
在使用 PySide 中的菜单时,只有 QAction 菜单项可以执行操作,QMenuBar 菜单栏和 QMenu 菜单都是不会执行任何操作的。
三、工具栏
与菜单类似,工具栏也是一组命令的集合地。菜单上放置的动作也可放到工具栏上,实现工具栏和菜单的同步。工具栏上除了放置动作外,还可以放置其他控件等。在 QMainWindow 窗口中,工具栏还可以拖动和悬浮。
工具栏 QToolBar 用于存放动作,动作在工具栏中一般呈现按钮状态。QToolBar 继承自 QWidget。用 QToolBar 类创建工具栏实例的方法如下:
QToolBar(parent:QWidget=None)
QToolBar(title:str, parent:QWidget=None)
其中 title 是工具栏控件的 标题名称,可通过 setWindowTitle(str) 方法修改;parent 是工具栏所在的 窗口。
QToolBar 类常用方法如下:
# 实例方法
addAction(action:QAction) -> None # 添加已经存在的动作到工具栏
addAction(text:str) -> QAction # 创建并添加动作,返回新建立的动作
addAction(icon:QIcon, title:str) -> QAction # 创建并添加动作,返回新建立的动作addSeparator() -> QAction # 添加分隔符
insertSeparator(before:QAction) -> QAction # 在指定的动作之前插入分隔符addWidget(widget:QWidget) -> QAction # 添加控件,并返回与控件关联的动作
insertWidget(before:QAction, widget:QWidget) -> QAction # 在指定的动作之前插入控件,并返回与控件关联的动作clear() -> None # 清空菜单widgetForAction(action:QAction) -> QWidget # 返回与动作关联的控件actionAt(x:int, y:int) -> QAction # 返回指定位置处的动作
actionAt(p:QPoint) -> QAction # 返回指定位置处的动作
actionGeometry(action:QAction) -> QRect # 返回指定动作的矩形区域setFloatable(floatable:bool) -> None # 设置动作是否可以浮在其他窗口上
isFloatable() -> bool # 返回动作是否可以浮在其他窗口上
isFloating() -> bool # 返回动作是否浮在其他窗口上
setMovable(movable:bool) -> None # 设置动作是否可以移动
isMovable() -> bool # 返回动作是否可以移动iconSize () -> QSize # 返回动作图标大小setOrientation(orientation:Qt.Orientation) -> None # 设置动作的方向
orientation() -> Qt.Orientation # 返回动作的方向toolButtonStyle() -> Qt.ToolButtonStyle # 返回动作样式setAllowedAreas(areas:Qt.ToolButtonArea) -> None # 设置可停靠的区域
allowedAreas() -> Qt.ToolButtonArea # 获取可停靠的区域
isAreaAllowed(area:Qt.ToolButtonArea) -> bool # 获取指定的区域是否可以停靠
toggleViewAction() -> QAction # 切换停靠窗口的可见状态# 槽函数
setIconSize(iconSize:QSize) -> None # 设置动作图标大小
setToolButtonStyle(toolButtonStyle:Qt.ToolButtonStyle) -> None # 设置动作样式
用 setOrientation(Qt.Orientation)
方法可以设置工具栏的方向,其中 Qt.Orientation可以取值如下:
Qt.Orientation.Horizontal # 水平
Qt.Orientation.Vertical # 竖直
用 setToolButtonStyle(Qt.ToolButtonStyle)
方法可以设置工具栏上按钮的风格,其中Qt.ToolButtonStyle 可以取值如下:
Qt.ToolButtonStyle.ToolButtonIconOnly # 只显示图标
Qt.ToolButtonStyle.ToolButtonTextOnly # 只显示文字
Qt.ToolButtonStyle.ToolButtonTextBesideIcon # 文字在图标的旁边)
Qt.ToolButtonStyle.ToolButtonTextUnderIcon # 文字在图标的下面)
Qt.ToolButtonStyle.ToolButtonFollowStyle # 遵循风格设置
在 QMainWindow 窗口中,用 setAllowedAreas(Qt.ToolBarArea)
方法可以设置工具栏的停靠区域,其中Qt.ToolBarArea 参数指定可以停靠的区域,可以取值如下:
Qt.ToolBarArea.LeftToolBarArea # 左侧
Qt.ToolBarArea.RightToolBarArea # 右侧)
Qt.ToolBarArea.TopToolBarArea # 顶部,菜单栏下部
Qt.ToolBarArea.BottomToolBarArea # 底部,状态栏上部
Qt.ToolBarArea.AllToolBarAreas # 所有区域都可以停靠
Qt.ToolBarArea.NoToolBarArea # 不可停靠
如果工具栏是可移动的,则无论 allowedAreas 设置何值都可以移动,但只有在进入 toolBar 的 allowedAreas 范围内时才会自动显示 toolBar 停靠区域范围,并在鼠标释放后自动在该范围内缩放,否则将保持最适合的大小浮动在窗口之上。
用 toggleViewAction()
方法返回一个动作对象,通过单击该动作对象可以切换停靠窗口的可见状态,即该动作是一个对停靠控件窗口进行显示或关闭的开关,如果将该动作加到菜单上,对应菜单栏的文字即为停靠窗口的标题名称,这样就可以在菜单上单击对应菜单项进行停靠窗口的关闭和显示。
QToolBar 类常用信号及其说明如下:
actionTriggered(action:QAction) # 工具栏按钮被触发时发射信号
allowedAreasChanged(allowedAreas:Qt.ToolBarArea) # 工具栏按钮显示区域改变时发射信号
iconSizeChanged(iconSize:QSize) # 工具栏按钮图标大小改变时发射信号
movableChanged(movable:bool) # 工具栏移动时发射信号
orientationChanged(orientation:Qt.Orientation) # 工具栏按钮显示的方向改变时发射信号
toolButtonStyleChanged(toolButtonStyle:Qt.ToolButtonStyle) # 文本显示样式改变时发射信号
topLevelChanged(topLevel:bool) # 工具栏浮动属性改变时发射信号
visibilityChanged(visible:bool) # 工具栏按钮是否可见改变时发射信号
工具按钮控件 QToolButton 常放在工具栏中,显示图标而不显示文字。通常为工具按钮设置弹出式菜单,用于选择之前的操作。
QToolButton 继承自 QAbstractButton。用 QToolButton 类创建工具按钮实例的方法如下:
QToolButton(parent:QWidget=None)
其中 parent 参数一般是工具按钮所在的 窗口 或 工具栏。
QToolButton 类的常用方法如下:
# 实例方法
setMenu(menu:QMenu) -> None # 设置菜单
setPopupMode(mode:QToolButton.PopupMode) -> None # 设置弹出模式
setArrowType(type:Qt.ArrowType) -> None # 设置箭头类型
setAutoExclusive(arg__1:bool) -> None # 设置是否互斥
setShortcut(key:str) -> None # 设置快捷键
setText(text:str) -> None # 设置文本
setIcon(icon:QIcon) -> None # 设置图标
setCheckable(arg__1:bool) -> None # 设置是否可选
setAutoRaise(enable:bool) -> None # 设置是否自动弹起# 槽函数
showMenu() -> None # 显示菜单
setDefaultAction(arg__1:QAction) -> None # 设置默认动作
setToolButtonStyle(style:Qt.ToolButtonStyle) -> None # 设置工具按钮样式
setIconSize(size:QSize) -> None # 设置图标大小
setChecked(arg__1:bool) -> None # 设置是否选中
click() -> None # 鼠标单击事件
用 setPopupMode(QToolButton.ToolButtonPopupMode)
方法可以设置菜单的弹出方式。其中参数 QToolButton.ToolButtonPopupMode 取值如下:
QToolButton.ToolButtonPopupMode.DelayedPopup # 用鼠标按下按钮并保持一会儿后弹出菜单
QToolButton.ToolButtonPopupMode.MenuButtonPopup # 在工具按钮的右下角上出现一个向下的黑三角,单击这个黑三角,弹出菜单
QToolButton.ToolButtonPopupMode.InstantPopup # 立即弹出菜单
在 QMainWindow 的 QToolBar 中使用工具按钮时,按钮会自动调节尺寸来适应 QMainWindow 的设置。按钮的外观和尺寸可通过 setToolButtonStyle(Qt.ToolButtonStyle)
方法和 setIconSize(QSize)
方法来设置,其中参数 Qt.ToolButtonStyle 可以取值如下:
Qt.ToolButtonStyle.ToolButtonIconOnly
Qt.ToolButtonStyle.ToolButtonTextOnly
Qt.ToolButtonStyle.ToolButtonTextBesideIcon
Qt.ToolButtonStyle.ToolButtonTextUnderIcon
Qt.ToolButtonStyle.ToolButtonFollowStyle
用 setArrowType(Qt.ArrowType)
方法可以设置工具按钮上的箭头形状,其中 Qt.ArrowType可以取值如下:
Qt.NoArrow
Qt.UpArrow
Qt.DownArrow
Qt.LeftArrow
Qt.RightArrow
QToolButton 类的常用信号如下:
triggered(arg__1:QAcion) # 激活动作时发射信号
clicked(checked=false) # 点击按钮时发射信号
pressed() # 按下按钮时发射信号
released() # 释放按钮时发射信号
import sysfrom PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtWidgets import QToolBar, QToolButton, QMenu
from PySide6.QtWidgets import QMessageBox, QComboBox
from PySide6.QtGui import Qt, QAction, QIconclass 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.创建一个工具栏toolBar = QToolBar(self)# 3.将工具栏添加到窗口中self.addToolBar(toolBar)# 4.设置工具栏是否可以移动toolBar.setMovable(True)# 5.设置工具栏的显示样式toolBar.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextUnderIcon)# 6.设置工具栏的方向toolBar.setOrientation(Qt.Orientation.Horizontal)# 7.添加图标按钮toolBar.addAction(QIcon("1.ico"), "新建")action_new = QAction(QIcon("1.ico"), "打开", self)action_open = QAction(QIcon("1.ico"), "打开", self)action_close = QAction(QIcon("1.ico"), "关闭", toolBar)toolBar.addAction(action_new)toolBar.addActions([action_open, action_close])# 8.添加其它组件comboBox = QComboBox()names = ["木之本樱", "御坂美琴", "夏娜"]comboBox.addItems(names)toolBar.addWidget(comboBox)# 9.添加工具按钮toolButton = QToolButton(self)# 创建菜单menu = QMenu("文件", self)# 往菜单中添加动作menu.addActions([action_new, action_open, action_close])# 为按钮控件添加菜单toolButton.setMenu(menu)# 设置工具按钮的箭头样式toolButton.setArrowType(Qt.ArrowType.DownArrow)# 设置工具按钮的样式toolButton.setPopupMode(QToolButton.ToolButtonPopupMode.InstantPopup)# 工具栏中添加工具按钮toolBar.addWidget(toolButton)# 9.为工具栏绑定actionTriggered信号toolBar.actionTriggered.connect(self.get_tooBar)def get_tooBar(self, toolBar):QMessageBox.information(self, "提示信息", f"你选择的是{toolBar.text()}", QMessageBox.StandardButton.Ok)if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())
如果设置垂直工具栏没有效果,那可能是你先调用
setOrientation(orientation)
设置工具栏方向,在将工具栏添加到窗体中。单击工具栏中的 QAction 对象默认会发送 actionTriggered 信号,但是如果为工具栏添加了其它控件,并不会发射 actionTriggered 信号,而是会发射它们自己的特有信号。
四、状态栏
状态栏 QStatusBar 一般放在独立窗口的底部,用于显示程序运行过程中的程序状态信息、提示信息、简要说明信息等,这些信息经过一小段时间后会自动消失。状态栏上也可以放置一些小控件等,用于显示永久信息,永久信息不会被实时信息遮挡住。
状态栏 QStatusBar 继承自 QWidget。用 QStatusBar 类创建状态栏实例的方法如下:
QStatusBar(parent:QWidget=None)
其中 parent 是状态的 父窗口,一般是独立窗口。
QStatusBar 类常用方法及其说明如下:
# 实例方法
urrentMessage() -> str # 获取当前显示的信息
addWidget(widget:QWidget, stretch:int=0) -> None # 在状态栏的左侧添加临时的控件,stretch是拉伸比例
insertWidget(index:int, widget:QWidget, stretch:int=0) -> None # 在状态栏的左侧插入临时的控件,stretch是拉伸比例
removeWidget(widget:QWidget) -> None # 从状态栏中移除控件
addPermanentWidget(widget:QWidget, stretch:int=0) -> None # 在状态栏的右侧添加永久性的控件,stretch是拉伸比例
insertPermanentWidget(index:int, widget:QWidget, stretch:int=0) -> None # 在状态栏的右侧插入永久性的控件,stretch是拉伸比例
setSizeGripEnabled(arg__1:bool) -> None # 设置在右下角是否有三角形
isSizeGripEnabled() -> bool # 获取右下角是否有三角形
hideOrShow() -> None # 确保右边的控件可见# 槽函数
showMessage(text:str, timeout:int=0) -> None # 显示信息,timeout是显示时间
clearMessage() -> None # 清空信息
用 showMessage(text:str,timeout:int=0)
方法设置状态栏要显示的信息,显示的信息从状态的左侧开始,其中参数 timeout 的单位是毫秒,设置信息显示的时间,经过 timeout 毫秒后信息自动消失,如果 timeout=0,则显示的信息一直保留到调用 clearMessage() 方法或再次调用 showMessage() 方法;用 clearMessage()
方法清除显示的信息;用 currentMessage()
方法获取当前显示的信息。
用 addPermanentWidget(QWidget,stretch:int=0)
方法或 insertPermanentWidget(index:int,widget:QWidget,stretch:int=0)
方法可以把其他控件添加到状态栏的右侧,用于显示一些永久的信息。其中参数 stretch 用于指定控件的相对缩放系数,index 是控件的索引号。
用 addtWidget(widget:QWidget,stretch:int=0)
方法或 insertWidget(index:int,QWidget,stretch:int=0)
方法可以把其他控件添加到状态栏的左侧,用于显示正常的信息,这些信息会被状态栏的信息遮挡住。
用 removeWidget(QWidget)
方法可以把控件从状态栏上移除,但控件并没有被真正删除,可以用 addWidget()
方法和 show()
方法将控件重新添加到状态栏中。
用 setSizeGripEnabled(bool)
方法可以设置状态栏的右侧是否有一个小三角形标识。
QStatusBar 类常用信号及其说明如下:
messageChanged(text:str) # 消息改变时发送信号
import sysfrom PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtWidgets import QStatusBar
from PySide6.QtWidgets import QComboBox
from PySide6.QtCore import QTimer, QDateTimeclass 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.创建一个状态栏self.statusBar = QStatusBar(self)# 3.将状态栏添加到窗口中self.setStatusBar(self.statusBar)# 4.向状态栏中添加控件comboBox = QComboBox()names = ["木之本樱", "御坂美琴", "夏娜"]comboBox.addItems(names)self.statusBar.addPermanentWidget(comboBox)# 5.1.创建一个QTime定时器对象timer = QTimer(self)# 5.2.发射timeout信号timer.timeout.connect(self.show_time)# 5.3.启动定时器timer.start()def show_time(self):# 获取当前日期时间datatime = QDateTime.currentDateTime()# 对日期时间进行格式化text = datatime.toString("yyyy_MM-dd HH:mm:ss")# 在状态栏中显示一条临时消息self.statusBar.showMessage(f"当前日期时间: {text}")if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())
默认情况下,状态栏中的临时消息和添加的控件不能同时显示,否则会发生覆盖重合的情况。此时,我们可以使用 addPermanentWidget(widget, stretch=0) 添加永久性控件来解决;
五、停靠控件
停靠控件 QDockWidget 主要应用在主窗口中,用鼠标可以将其拖拽到不同的停靠区域中。停靠控件通常作为容器来使用,需要在其内部添加一些常用控件。停靠控件由标题栏和内容区构成,标题栏上显示窗口标题,还有浮动按钮和关闭按钮。
停靠控件 QDockWidget 继承自 QWidget。用 QDockWidget 类创建停靠控件实例的方法如下所示:
QDockWidget(parent:QWidget=None, flags:Qt.WindowFlags=Default(Qt.WindowFlags))
QDockWidget(title:str, parent:QWidget=None, flags:Qt.WindowFlags=Default(Qt.WindowFlags))
其中 title 是停靠控件的 窗口标题,parent 是停靠控件所在的 窗口。
停靠控件 QDockWidget 类常用的方法如下:
setAllowedAreas(areas:Qt.DocksWidthArea) -> None # 设置可停靠区域
isAreaAllowed(area:Qt.DocksWidthArea) -> bool # 获取区域是否允许停靠
allowedAreas() -> Qt.DocksWidthArea # 获取可停靠区域setFeatures(features:Qt.DocksWidthFeatures) -> None # 设置特征
setFloating(floating:bool) -> None # 设置是否浮动状态setTitleBarWidget(widget:QWidget) -> None # 设置标题栏控件
titleBarWidget() -> QWidget # 获取标题栏控件setWidget(widget:QWidget) -> None # 添加控件
widget() -> QWidget # 获取控件toggleViewAction() -> QAction # 获取隐藏或显示的动作
用 setFeatures(QDockWidget.DockWidgetFeatures)
方法设置停靠控件的特征,其中参数 QDockWidget.DockWidgetFeature 可以取值如下:
QDockWidget.DockWidgetFeature.DockWidgetClosable # 可关闭
QDockWidget.DockWidgetFeature.DockWidgetMovable # 可移动
QDockWidget.DockWidgetFeature.DockWidgetFloatable # 可悬停
QDockWidget.DockWidgetFeature.DockWidgetVerticalTitleBar # 有竖向标题
QDockWidget.DockWidgetFeature.NoDockWidgetFeatures # 没有以上特征
用 toggleViewAction()
方法返回一个 QAction 动作对象,单击该动作对象可以切换停靠窗口的可见状态,即该动作是一个对停靠控件窗口进行显示或关闭的开关。如果将该动作加到菜单上,对应菜单栏的文字即为停靠窗口的 title 文字,这样就可以在菜单上单击对应菜单项进行停靠窗口的关闭和显示。
停靠控件 QDockWidget 类常用的信号如下:
allowedAreasChanged(allowedAreas:Qt.DockWidgetAreas) # 允许停靠的区域发生改变时发射信号
dockLocationChanged(area:Qt.DockWidgetArea) # 停靠的区域发生改变时发射信号
featuresChanged(features:QDockWdget.DockWidgetFeature) # 特征改变时发射信号
topLevelChanged(topLevel:bool) # 悬浮和停靠状态转换时发射信号
visibilityChanged(visible:bool) # 可见性改变时发射信号
import sysfrom PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtWidgets import QDockWidget
from PySide6.QtWidgets import QFontComboBox
from PySide6.QtCore import Qtclass 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.创建停靠控件dock_font = QDockWidget("字体", self)dock_font.setObjectName("字体")dock_color = QDockWidget("颜色", self)dock_color.setObjectName("颜色")# 3.在主窗口中添加停靠控件self.addDockWidget(Qt.DockWidgetArea.LeftDockWidgetArea, dock_font)self.addDockWidget(Qt.DockWidgetArea.LeftDockWidgetArea, dock_color)# 4.设置停靠控件的特征dock_font.setFeatures(QDockWidget.DockWidgetFeature.DockWidgetFloatable |QDockWidget.DockWidgetFeature.DockWidgetMovable |QDockWidget.DockWidgetFeature.DockWidgetClosable)dock_font.setFeatures(QDockWidget.DockWidgetFeature.DockWidgetFloatable |QDockWidget.DockWidgetFeature.DockWidgetMovable |QDockWidget.DockWidgetFeature.DockWidgetClosable)# 5.两个悬停控件层叠self.tabifyDockWidget(dock_font, dock_color)# 6.创建字体组合框框控件对象fontComboBox = QFontComboBox()# 7.往停靠控件中添加控件dock_font.setWidget(fontComboBox)# 8.定义信号与槽的连接self.tabifiedDockWidgetActivated.connect(self.choose_dock_widget)def choose_dock_widget(self, dockWidget):print(f"你选择了【{dockWidget.objectName()}】停靠控件")if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())