首页 > 其他分享 >21. 主窗口控件

21. 主窗口控件

时间:2025-01-09 19:22:22浏览次数:1  
标签:控件 None 菜单 窗口 21 QAction 工具栏 Qt

一、主窗口控件

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

from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtWidgets import QMenuBar, QMenu
from PySide6.QtWidgets import QMessageBox
from PySide6.QtGui import QAction, QPixmap

class 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 sys

from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtWidgets import QToolBar, QToolButton, QMenu
from PySide6.QtWidgets import QMessageBox, QComboBox
from PySide6.QtGui import Qt, QAction, QIcon

class 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 sys

from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtWidgets import QStatusBar
from PySide6.QtWidgets import QComboBox
from PySide6.QtCore import QTimer, QDateTime

class 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 sys

from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtWidgets import QDockWidget
from PySide6.QtWidgets import QFontComboBox
from PySide6.QtCore import Qt

class 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())

标签:控件,None,菜单,窗口,21,QAction,工具栏,Qt
From: https://www.cnblogs.com/FlurryHeart/p/18662775

相关文章

  • docs-merge-21
    TowardsDataScience2024中文翻译(二十二)原文:TowardsDataScience协议:CCBY-NC-SA4.0为什么2024年诺贝尔化学奖(人工智能化学奖)如此重要原文:towardsdatascience.com/why-the-2024-nobel-prize-in-ai-for-chemistry-matters-so-much-a06126cb5ca3?source=collection_archiv......
  • C# WinForm用户控件 vs 窗体:3大区别 + 4个使用场景 = 完美掌握!
    ......
  • 【C++动态规划 数学】1039. 多边形三角剖分的最低得分|2130
    本文涉及知识点C++动态规划数学LeetCode1039.多边形三角剖分的最低得分你有一个凸的n边形,其每个顶点都有一个整数值。给定一个整数数组values,其中values[i]是第i个顶点的值(即顺时针顺序)。假设将多边形剖分为n-2个三角形。对于每个三角形,该三角形的值......
  • 发那科FANUC机器人A06B-0652-B212电机维修基本流程
    发那科FANUC机器人以其卓越的性能和可靠性赢得了广泛的认可。然而,就像其他任何机械设备一样,长时间的运行和复杂的工作环境都可能使伺服电机面临维修的需求。为了确保您的发那科FANUC机器人A06B-0652-B212电机始终保持在最佳状态,发那科伺服电机维修服务显得尤为重要。一、发那科FA......
  • 3298.统计重新排列后包含另一个字符串的字符串数目 I II滑动窗口 优化思路解析全网最
    II相比于I是数据范围变成了10的6次方了我们来维护大小关系,把不用的都去掉,优化到O(26n)首先判断一下要找子字符串的s长度是否小于t字符串,如果小于的话直接返回0初始答案变量和left左指针为0用Counter来记录t中所有字符出现次数(当然记录s字符串出现次数也是可以的)然后......
  • 移民统计年鉴(1996-2021年)-社科数据
    移民统计年鉴(1996-2021年)-社科数据https://download.csdn.net/download/paofuluolijiang/90028564https://download.csdn.net/download/paofuluolijiang/90028564移民统计年鉴(1996-2021年)提供了一个全面的视角,以了解全球移民趋势和数据。这份年鉴详细记录了每年的全球移民......
  • .NET 窗口置于最顶层的几种方法
    本文介绍如何将窗口置于最顶层,以及解决在顶层显示时对锁屏登录界面的影响等问题。用于实现类似Launcher、系统工具等应用需要窗口层级比Windows开始菜单以及置顶任务栏还要高的场景一般情况下的窗口置顶,可以设置WPF窗口属性Topmost=true也可以使用WIN32-SetWindowPos函数SetWin......
  • 20. 容器控件
    一、容器控件  容器类控件不能输入输出数据,通常作为常用控件的载体,将常用控件“放置”到其内部。容器控件对放到其内部的控件进行管理,并成为控件的父控件。  我们可以在终端中使用pip安装pyside6模块。pipinstallpyside6二、分组框控件  QGroupBox控件,又称为分......
  • .NET 窗口置于最顶层
    本文介绍如何将窗口置于最顶层,以及解决在顶层显示时对锁屏登录界面的影响等问题。用于实现类似Launcher、系统工具等应用需要窗口层级比Windows开始菜单以及置顶任务栏还要高的场景一般情况下的窗口置顶,可以设置WPF窗口属性Topmost=true也可以使用WIN32-SetWindowPos函数SetWind......
  • P7603 [THUPC2021] 鬼街 题解
    P7603[THUPC2021]鬼街题解第一次见折半报警器的trick,记录一下首先观察到\(x\len\le10^5\),所以\(x\)最多有6个质因数,\(x=30030\)可以取到,这使得对于修改,我们可以暴力单点修改。接下来考虑询问,朴素的做法是:每一次灵异事件之后,都对所有监控器进行检验是否满足和......