21. 主窗口控件

news/2025/1/9 19:14:26/文章来源:https://www.cnblogs.com/FlurryHeart/p/18662775

一、主窗口控件

  之前,我们使用可视控件创建具体的实例时都选择了一个父窗体,将控件放到这个窗体上,即使在创建实例时没有选择父窗体,也可以用控件的 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 步。

  1. 需要建立放置菜单的容器,即菜单栏;
  2. 在菜单栏上添加菜单,或者在菜单上添加子菜单;
  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())

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

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

相关文章

智慧帮手:一站式搭建帮助中心,优化客户服务体验

在数字化时代,客户服务已成为企业赢得市场、留住客户的关键。一个高效、便捷的帮助中心,不仅能够快速响应客户需求,还能提升客户满意度和忠诚度。然而,如何搭建一个既满足客户需求又符合企业特色的帮助中心,成为众多企业面临的挑战。本文将探讨如何借助一站式解决方案,如…

解锁餐饮新篇:精准搭建内部知识库,赋能高效运营

在当今竞争激烈的餐饮行业中,提升运营效率和服务质量已成为企业脱颖而出的关键。随着餐饮业务的不断扩展,内部信息管理和知识传承成为了一大挑战。如何构建一个高效、精准的内部知识库,成为解锁餐饮新篇章的重要一环。本文将探讨如何借助智能化工具,如HelpLook,实现这一目…

【YashanDB知识库】进行load data的时候报找不到动态库liblz4.so

本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7863047.html?templateId=1718516 现象 23.2版本的依赖项准备里指明,要依赖动态库:liblz4.so,liblz4.so.1,liblz4.so.1.9.3 在执行load data的时候报找不到动态库liblz4.so 操作系统在/lib64/目…

JAVA-Day 08:For循环语句

For循环 For循环格式 for循环语句格式 for(初始化语句;条件判断语句;条件控制语句){ 循环语句体; } 执行流程: 1、执行初始化语句 2、执行条件判断语句,看其结果是True还是False,如果是True,执行循语句体,如果是False,循环结束 3、执行条件控制语句 4、回到2继续执行条件判…

记录---JS 的蝴蝶效应 —— 事件流

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣前言 在 JavaScript 的世界里,事件流就像一只永不停歇的蝴蝶,每一个动作、每一个点击、每一个滚动,都会触发一连串的蝴蝶效应。作为一名开发者,掌握事件流的艺术,不仅能让你的网页更加生动、更加交互,也能让用户体验…

HTTPS 加密机制

HTTPS 概述 HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。…

leetcode131 分割回文串

leetcode 131思路:回溯 比如说aab,对于每个元素currentNum,有两种选择: 1.如果currentNum<len-1,可以将当前元素加入到currentStr中,然后dfs(start,currentNum+1)。而currentNum==len-1时不能dfs(start,currentNum+1),这样下一轮循环就执行以下代码了 if (currentNum…

Fake Location强制升级解决办法

Fake Location强制升级解决办法 一、下载链接中的软件并安装其中的APK https://www.123865.com/s/TXeiTd-fla7d 二、进入LSPosed软件,点击应用伪装三、勾选Fake Location四、进入应用伪装软件并点击Fake Location五、往下滑,找到应用版本号,并填写为1599, 然后点击右上角的…

【分布式】优雅实现多系统一致性补偿方案

前言 我们在开发的过程中,如果一个业务操作需要本地写MYSQL数据以及对第三方系统做写操作,那么这种流程就涉及到分布式系统一致性的问题,然而并非所有系统都能使用成熟的分布式事务方案 案例说明 以一个财务报账业务为例,涉及到的系统如下:系统名 作用 实现方案单据系统 申…

【ABAP】S4中的官方demo程序

1. abap demo包含cds、opensql、loop at group 等开发对象及语法的demo程序 包名:SABAPDEMOS 2. salv demo主要是一些salv开发相关的demo,包含树状显示、弹窗显示等包名:SALV_OM_OBJECTS

使用云数据库RDS和低代码开发平台“魔笔”,高效构建门户网站,完成任务领智能台灯!

传统建站涵盖需求分析、设计、开发、运维等环节。需分析软硬件需求并购买配置,设计网页布局,前后端编码调试,涉及业务逻辑、数据库及API。更新时需调整设计与代码。运营期需进行服务器维护、数据监控和安全检查,整个过程耗资费力。 本方案将为您详细介绍如何使用云数据库RD…

salesforce零基础学习(一百四十二)在Formula字段中如何通过Datetime字段显示Local Time(适配DST)

背景: 我们需求是显示Date Time类型的Time信息,比如我们想要在report中基于Hour Of Created Date进行分组,从而想要了解到一段时间内什么时间是数据创建的高峰期,不同的running user可能时区不同,比如中国时区是GMT+8,日本的时区是GMT+9,美国可能不同的州对应的时区也不…