一、工具按钮QToolButton
1.QToolButton的介绍(官翻)
工具按钮是一种特殊的按钮,提供对特定命令或选项的快速访问。与普通的命令按钮不同,工具按钮通常不显示文本标签,而是显示一个图标。
工具按钮通常是在使用addAction()创建新的QAction实例或使用addAction()将现有操作添加到工具栏时创建的。也可以像构造其他部件一样构造工具按钮,并在布局中将它们与其他部件排列在一起。
工具按钮的一个经典用法是选择工具;例如,绘图程序中的“钢笔”工具。这可以通过使用QToolButton作为切换按钮来实现(参见setCheckable())。
QToolButton支持自动提升。在auto-raise 模式下,只有当鼠标指向它时,按钮才会绘制一个3D帧。当在QToolBar中使用按钮时,该功能会自动打开。用setAutoRaise()修改它。
工具按钮图标设置为QIcon。这使得为禁用和激活状态指定不同的像素映射成为可能。当按钮的功能不可用时,将使用禁用的pixmap。当按钮自动升起时,会显示活动的像素图,因为鼠标指针悬停在它上面。
通过setToolButtonStyle()和setIconSize()可以调整按钮的外观和尺寸。当在QMainWindow的QToolBar中使用时,该按钮自动调整到QMainWindow的设置(参见setToolButtonStyle()和setIconSize())。除了图标,工具按钮还可以显示用arrowType指定的箭头符号。
工具按钮可以在弹出菜单中提供额外的选择。可以使用setMenu()设置弹出菜单。使用setPopupMode()来配置带有菜单集的工具按钮的不同模式。默认模式是DelayedPopupMode,有时与web浏览器中的“返回”按钮一起使用。长按这个按钮一段时间后,会弹出一个菜单,列出要跳转的页面列表。超时时间取决于样式,参见SH_ToolButton_PopupDelay。
2.QToolButton的常用方法
API函数 | 参数说明 | 返回值 | 功能作用 |
QToolButton(parent) | parent: QWidget | None | 创建一个工具按钮 |
setArrowType(self, type) | type: Qt.ArrowType | None | 按钮图标被替换为一个箭头进行显示 |
arrowType(self) | None | Qt.ArrowType | 获取按钮箭头的显示类型 |
setText(self, text) | text: str | None | 设置动作的显示文本 |
text(self) | None | str | 获取动作的显示文本 |
setIcon(self, icon) | icon: Union[QIcon, QPixmap] | None | 设置动作的图标 |
icon(self) | None | QIcon | 获取动作的图标 |
setDefaultAction(self, arg__1) | arg_1: QAction | None | 设置默认动作,以粗体字显示 |
defaultAction(self) | None | QAction | 获取菜单的默认动作 |
hitButton(self, pos) | pos:QPoint | bool | 设置按钮点击的有效区域 |
setMenu(self, menu) | menu:QMenu | None | 设置菜单 |
menu(self) | None | None | 获取菜单 |
showMenu(self) | None | None | 弹出菜单 |
minimumSizeHint(self) | None | QSize | 返回按钮的最小尺寸 |
setPopupMode(self, mode) | mode: QToolButton. ToolButtonPopupMode | None | 设置菜单的弹出方式 |
popupMode(self) | None | mode: QToolButton. ToolButtonPopupMode | 获取菜单的弹出方式 |
setToolButtonStyle(self, toolButtonStyle) | toolButtonStyle: Qt.ToolButtonStyle | None | 设置工具按钮风格 |
toolButtonStyle(self) | None | Qt.ToolButtonStyle | 获取工具按钮风格 |
sizeHint(self) | None | QSize | 返回按钮的建议尺寸 |
autoRaise(self) | None | bool | 获取是否启用自动提升 |
setAutoRaise(self, enable) | enable: bool | None | 设置是否启用自动提升 |
1) 工具按钮和QToolButton的含义
QToolButoon继承自QAbstractButton,所以他拥有按压按钮的一起特征。通常我们会理解为其是专门作为工具栏中使用的按钮而设置的。
但,我们看前面官翻中看到,“工具按钮通常是在使用addAction()创建新的QAction实例或使用addAction()将现有操作添加到工具栏时创建的。”看到这句话是否很懵逼,怎么工具按钮的创建和QAction的创建和添加有毛关系。事实是,工具栏只接受QAction作为子控件进行添加。但在使用工具栏时其会有QToolBar.setWidget()这个方法,这个方法的参数是QWidget及其子类,表现的好像其能够直接将QWidget及其子类添加到工具栏中使用。大家可以试验一下,使用QToolBar.setWidget()添加几个控件,在打印QToolBar.actions()看一下结果就会发现,所有被添加进去的QWidget及其子类都是变为了QWigetAction类。在QWidgetAction章节也说过,QWidgetAction是QAction的子类,所以才说,工具栏只接受QAction作为子控件。
针对官翻中那句话,那么个人理解这句话中的工具按钮就不是仅仅指QToolButton,而是指“具有工具按钮性质”的这些按钮,这些按钮可能是QToolButton创建的,也可能是QAction,或者是QWidgetAction创建的。工具按钮的性质也可以概括为:“提供对特定命令或选项的快速访问。与普通的命令按钮不同,工具按钮通常不显示文本标签,而是显示一个图标”。所以,官翻原文中的工具按钮和QToolButton要分开理解。
2) QToolButton在工具栏和在其他QWidget子类面板中的表现形式
QToolButton作为一个QWidget的可视化子类,其父控件为QWidget,仅仅设置icon和text的时候外观与其被添加到工具栏中的QAction类似,但这是由于其默认情况,setAutoRaise(True);当setAutoRaise(Flase)时,其外观与QPushButton类似。另外,QToolButton添加进工具栏后所表现的样式与QAction一致(前面也说了,他实际就变为一个QWigetAction了)。
3)QToolButton的图标与文字位置、指示箭头的设置。
setToolButtonStyle( )是针对QToolButton在显示时,图标与文本的显示设置,其是一个枚举类:
枚举类 | 枚举常量 | 枚举值 | 功能描述 |
Qt.ToolButtonStyle | ToolButtonIconOnly | 只显示图标 | |
ToolButtonTextOnly | 只显示标题 | ||
ToolButtonTextBesideIcon | 标题在图标旁边 | ||
ToolButtonTextUnderIcon | 文本在图标下侧 | ||
ToolButtonFollowStyle | 跟随QStyle风格 |
setArrowType( )会强制生成一个三角形箭头(丑到爆)图标,默认情况下是NoArrow。如果工具栏创建时有添加图标,则会用三角形箭头替代图标。其参数是一个枚举类:
枚举类 | 枚举常量 | 枚举值 | 功能描述 |
Qt.ArrowType | NoArrow | 不显示箭头 | |
UpArrow | 向上箭头 | ||
DownArrow | 向下箭头 | ||
LeftArrow | 向左箭头 | ||
RightArrow | 向右箭头 |
说白了,这个箭头就是指示通过setMenu()所设置menu的弹出方向,但是它不能控制menu的弹出方向,仅仅起到一个外观指示的作用。这种情况下就需要我们重写他的PressedEvent事件,在其pressedEvent事件中添加菜单和弹出菜单,并实现弹出位置与箭头的方向的匹配。
4)QToolButton的菜单弹出
上一小节我们说了重写他的PressedEvent事件从而弹出菜单,这种方式显得很笨拙,同时,哪个三角箭头太丑了,还要改样式。但是,QToolButton是可以设置菜单的,当我们通过setMenu()方法将菜单设置给QToolButton后,QToolButton会在右下角显示一个很小的三角标识这个QToolButton拥有菜单。同时,点击QToolButton,菜单不是同步弹出的,而是有延迟,需要按住鼠标。menu的弹出方式由setPopupMode( )来控制,其参数也是一个枚举类:
枚举类 | 枚举常量 | 枚举值 | 功能描述 |
QToolButton.ToolButtonPopupMode | DelayedPopup | 在按住工具按钮一段时间后(超时时间取决于样式,参见SH_ToolButton_PopupDelay),菜单显示出来。一个典型的应用例子是某些浏览器工具栏中的“后退”按钮。如果用户单击它,浏览器会简单地浏览回上一页。如果用户长按该按钮一段时间,工具按钮将显示一个包含当前历史记录列表的菜单 | |
MenuButtonPopup | 工具按钮显示一个特殊的箭头,以表明有一个菜单。当按下按钮的箭头部分时,菜单就会显示出来。 | ||
InstantPopup | 当按下工具按钮时,菜单立即显示。在这种模式下,按钮本身的动作不会被触发。 |
可见,我们上面说的如果给QToolButton设置菜单,点击它延迟弹出的情况就是默认情况下菜单弹出的模式为DelayedPopup。
当我们将菜单模式设置为MenuButtonPopup是,显示样式是这样的:
这就和我们前面学习工具栏中添加带子菜单的QAction样式一样了。
还有一个现象,如果工具栏中先添加QAction,后为QAction设置子菜单,他的样式和工具按钮的DelayedPopup模式样式一致。而先为QAction添加子菜单,后将QAction添加到工具栏,他的样式又与工具按钮的DelayedPopup模式样式一致。
实际上,将QToolButton与QToolBar一起学习并不合适,应该将其与QToolBox一起学习。QToolBox与QToolButton一起才是真的适配。看下图:
这是一张早起的QQ的界面,左面的主界面框架中重要的部分就是QToolBox特征,而其中每个好友的头像位置实际我们就可以使用QToolButton来实现,头像就是icon,好友的名字就是text,那么QToolButton的ToolButtonStyle肯定就是ToolButtonTextBesideIcon。
我们将会在学完QToolBox以后,模拟这个早期的QQ编写一个可用的界面。
3.QToolButton的信号
信号 | 参数说明 | 返回值 | 功能作用 |
triggered(QAction) | QAction | None | 按钮按下时发射此信号,参数为引起信号发出的动。 |
pressed() | None | 按下按钮时发射信号,同时将参数传递给槽函数 | |
released() | None | 释放按钮时发射信号,同时将参数传递给槽函数 | |
clicked() | bool | 点击按钮(按下和释放)时发射信号,同时将参数传递给槽函数 |
二、工具栏QToolBar
1.QToolBar的介绍(官翻)
工具栏通常通过调用addToolBar(const QString &title)创建,但它也可以作为QVBoxLayout中的第一个部件添加。
工具栏按钮是通过添加操作来添加的,可以使用addAction()或insertAction()。可以使用addSeparator()或insertSeparator()来分隔一组按钮。如果工具栏按钮不合适,可以使用addWidget()或insertWidget()插入小部件。合适的小部件示例有QSpinBox、QDoubleSpinBox和QComboBox。当工具栏按钮被按下时,它会发出actionTriggered()信号。
工具栏可以固定在特定区域(例如窗口顶部),也可以在工具栏区域之间移动;请参见setMovable()、isMovable()、allowedAreas()和isAreaAllowed()。
当工具栏太小而无法显示它所包含的所有项目时,一个扩展按钮将作为工具栏的最后一个项目出现。按下扩展按钮将弹出一个包含项目的菜单,目前不适合在工具栏。
当QToolBar不是QMainWindow的子组件时,它就失去了用addWidget()添加到工具栏的小部件填充扩展弹出框的能力。请使用通过继承QWidgetAction并实现createWidget()创建的widget操作。
2.QToolBar的常用方法
API函数 | 参数说明 | 返回值 | 功能作用 |
QToolBar(title, parent) | tilte:str parent:QWidget | None | 创建一个工具栏 |
QToolBar( parent) | parent:QWidget | None | 创建一个工具栏 |
addAction(self,action) | action:QAction | None | 在工具栏中添加新动作 |
addAction(self,text) | text:str | QAction | 在工具栏中添加新动作 |
addAction(self,icon,text) | icon:QIcon text:str | QAction | 在工具栏中添加新动作 |
addSeparator(self) | None | QAction | 添加一个分割线 |
insertSeparator(self, before) | before:QAction | QAction | 在一个动作前添加一个分割线 |
clear(self) | None | None | 清空工具栏 |
actionAt(self, arg__1) | arg_1:QPoint | QAction | 获取指定坐标处的动作 |
actionAt(self, x,y) | x:int,y:int | QAction | 获取指定坐标处的动作 |
actionGeometry(self, arg__1) | arg_1: QAction | QRect | 返回动作的几何矩形 |
addWidget(self, widget) | widget:QWidget | QAction | 添加控件,返回控件关联的动作 |
insertWidget(self, before, widget) | befor:QACTION widget:QWidget | QAction | 在动作前插入控件 |
widgetForAction(self, action) | QAction | QWidget | 获取与动作关联的控件 |
setAllowedAreas(self, areas) | areas: Qt.ToolBarArea | None | 设置工具栏在QMainWindow中可停靠的区域 |
allowedAreas(self) | None | Qt.ToolBarArea | 获取工具栏在QMainWindow中可停靠的区域 |
isAreaAllowed(self, area) | None | areas: Qt.ToolBarArea | 获取指定的区域是否可以停靠 |
setIconSize(self, iconSize) | iconSize:QSize | None | 设置工具栏中图标的允许最大尺寸 |
iconSize(self) | None | QSize | 获取设置工具栏中图标尺寸 |
setFloatable(self, floatable) | floatable:bool | None | 设置工具栏在QMainWindow中是否可以浮动 |
isFloatable(self) | None | bool | 获取工具栏是否可以浮动 |
isFloating(self) | None | bool | 获取工具栏是否处于浮动状态 |
setMovable(self, movable) | movable :bool | None | 设置工具栏在QMainWindow中是否可以拖动 |
isMovable(self) | None | bool | 获取工具栏在QMainWindow中是否可以拖动 |
setOrientation(self, orientation) | orientation: Qt.Orientation | None | 设置工具栏的方向 |
orientation(self) | None | Qt.Orientation | 获取工具栏的方向 |
setToolButtonStyle(self, toolButtonStyle) | toolButtonStyle: Qt.ToolButtonStyle | None | 设置工具栏上的按钮风格 |
toolButtonStyle(self) | None | Qt.ToolButtonStyle | 获取工具栏上的按钮风格 |
toggleViewAction(self) | None | QAction | 切换停靠窗口的可见状态 |
工具栏前面已经用过多次,这里不再过多讲解,他的方法说明都很好理解。这里主要解释一下
setAllowedAreas(self, areas)、setFloatable(self, floatable)、setMovable(self, movable)、setOrientation(self, orientation)、toggleViewAction(self)这几个方法,这几个方法通常是QToolBar放置在QMainWindow中使用时才有的特性。QMainWindow是一个设置好的主界面,在这个界面中,已经内置了QToolBar。离开QMainWindow,这几个方法也就基本不起作用。这几个方法的具体的使用我们将在QMainWindow中进行学习。
3.QToolBar的信号
信号 | 参数说明 | 返回值 | 功能作用 |
actionTriggered(QAction) | QAction | 动作被触发时发送信号 | |
iconSizeChanged(QSize) | QSize | 按钮尺寸发生改变时发送信号 | |
movableChanged(bool) | bool | 可移动状态发生改变时发送信号 | |
orientationChanged(Qt. Orientation) | Qt. Orientation | 工具栏方向发生改变时发送信号 | |
toolButtonStyleChanged(Qt.ToolButtonStyle) | Qt.ToolButtonStyle | 工具栏的风格发生改变时发送信号 | |
topLevelChanged(bool) | bool | 悬浮状态发生改变时发送信号 | |
visibilityChanged(bool) | bool | 可见状态发生改变时发送信号 |