08. 按钮控件

一、按钮控件

  PySide6 中按钮分为 push 按钮(按压型)、check 按钮(勾选型)和 toggle 按钮(切换型,多个按钮中只有一个可以选中)。其中,push 按钮有 QPushButton 按钮和 QToolButton 按钮,check 按钮是 QCheckBox 按钮,toggle 按钮是 QRadioButton,它们都继承自 QAbastractButton,除此之外还有个从 QPushButton 继承而来的 QCommandLinkButton 按钮。

  我们可以在终端中使用 pip 安装 PySide6 模块。默认是从国外的主站上下载,因此,我们可能会遇到网络不好的情况导致下载失败。我们可以在 pip 指令后通过 -i 指定国内镜像源下载

pip install pyside6 -i https://mirrors.aliyun.com/pypi/simple

  国内常用的 pip 下载源列表:

按钮控件继承图

二、抽象按钮

  抽象按钮 QAbstractButton 是所有按钮控件的基类,不能直接使用,它为其他按钮提供一些共同的属性和信号。QAbstractButton 为按钮类提共一些共同的属性和方法。

# 实例方法
setText(text:str) -> None                                                       # 设置文本
text() -> str                                                                   # 获取文本

setIcon(icon:Union[QIcon, QPixmap]) -> None                                     # 设置图标
icon() -> QIcon                                                                 # 获取图标

iconSize() -> QSize                                                             # 获取图标大小

setCheckable(checkable:bool) -> None                                            # 设置是否可选中
isCheckable() -> bool                                                           # 获取是否可选中
isChecked() -> bool                                                             # 获取是否被选中

setAutoRepeat(enable:bool) -> None                                              # 设置是否具有自动重复性
autoRepeat() -> bool                                                            # 获取是否具有自动重复性

setAutoRepeatDelay(delay:int) -> None                                           # 设置重复执行的延迟时间
autoRepeatDelay() -> int                                                        # 获取重复执行的延迟时间

setAutoRepeatInterval(interval:int) -> None                                     # 设置重复发送信号的时间间隔
autoRepeatInterval() -> int                                                     # 获取重复执行的时间间隔

setAutoExclusive(exclusive:bool) -> None                                        # 设置自动互斥状态,即按钮是否只能被单击一次
autoExclusive() -> bool                                                         # 获取是否具有互斥性

setShortcut(key:Union[QKeySequence, QKeySequence.StandardKey ,str]) -> None     # 设置快捷键
shortcut() -> QKeySequence                                                      # 获取快捷键

setDown(on:bool) -> None                                                        # 设置按钮是否按下,若设置为True,则不会发送pressed()或clicked()信号

hitButton(pos:QPoint) -> bool                                                   # 如果pos点在按钮内部,则返回True

# 槽方法
setIconSize(size:QSize) -> None                                                 # 设置图标大小
setChecked(checked:bool) -> None                                                # 设置是否被选中
animateClick() -> None                                                          # 用代码执行一次按钮被按下动作,发送相应的信号
click() -> None                                                                 # 用代码执行一次按钮被单击动作,发送相应的信号。如果按钮可以勾选,则勾选状态发生改变
toggle() -> None                                                                # 用代码切换按钮的勾选状态

  按钮都有 setText(text:str)setIcon(icon:QIcon) 方法,分别 设置按钮上的文字和图标;用 text()icon() 方法 获取按钮的文字和图标;用 setIconSize(size:QSize) 方法 设置图标的尺寸

  按钮文字中若有 &,则 & 后的字母是 快捷键,在界面运行时按 Alt+ 字母键 会发送按钮的信号,如果要在按钮中显示 & 方法,则需要用两个 && 表示一个 &

  对于没有文字的按钮,用 setShortcut(key:Union[str, QKeySequence]) 设置快捷键,其中 QKeySequence 是用于 定义快捷键的类,例如用 setShortcut("Ctrl+O")setShortcut(QKeySequence("Ctrl+O")) 表示的快捷键是键盘的 Ctrl 键和 O 键的组合。

  快捷键也可以是枚举常量 Qt.Modifier 和常量 Qt.Key 的组合,Qt.Modifier 可取值如下:Qt.Modifier.SHIFTQt.Modifier.METAQt.Modifier.CTRLQt.Modifier.ALT。常量 Qt.Key 可取值如下 Qt.Key.Key_A ~ Qt.Key.Key_ZQt.Key.Key_0 ~ Qt.Key.Key_9 等,例如 setShortcut(QKeySequence(Qt.CTRL | Qt.ALT | Qt.Key_O)) 表示的快捷键是键盘的 Ctrl 键、Alt 键和 O 键的组合。

  也可以使用 QKeySequence 中的标准快捷键枚举常量 QKeySequence.StandardKey 来定义,一些常用的标快快捷键定义如下:

QKeySequence.StandardKey.Open                                                   # Ctrl + O
QKeySequence.StandardKey.Close                                                  # Ctrl + F4
QKeySequence.StandardKey.Cut                                                    # Ctrl + X
QKeySequence.StandardKey.Copy                                                   # Ctrl + C
QKeySequence.StandardKey.Paste                                                  # Ctrl + V
QKeySequence.StandardKey.Print                                                  # Ctrl + P
QKeySequence.StandardKey.Find                                                   # Ctrl + F

  用 setCheckable(checkable:bool) 方法可以 设置按钮是否可以进行勾选如果多个有可勾选的按钮在同一容器中,且 setAutoExclusive(exclusive:bool) 设置为 True,则只能有一个按钮处于选中状态。对于 QCheckBox 按钮 autoExclusive 默认是 False。对 QRadioButton 默认是 True。用 setChecked(checked:bool)方法 设置按钮是否可以选中,用 isChecked() 方法 获取按钮的勾选状态

  如果 setAutoRepeat(repaet:bool) 设置为 True,则在长时间按住按钮时,每经过固定长度的时间间隔后,信号 pressed()released()clicked() 就会发送一次,用 setAutoRepeatInterval(interval:int)方法 设置这个时间间隔(毫秒),用 setAutoRepeatDelay(delay:int)方法 设置首次发送信号的延迟时间(毫秒)。

  按钮控件中类常用信号及其说明如下:

pressed()                                                                       # 当按钮按下时发射信号
released()                                                                      # 当按钮释放时发射信号
clicked(checked:bool=false)                                                     # 当按钮被单击时发射信号
toggled(checked)                                                                # 当按钮状态改变时发射信号

  其中信号 pressed()released()clicked() 的发送是有先后顺序的。当在按钮上按下鼠标左键时,首先发送的是 pressed() 信号;在按钮上松开左键时,先发送 released() 信号,再发送 clicked() 信号如果在按钮上按下左键,然后按住左键不放,将光标移开按钮,则会发送 released() 信号,不会再发送 clicked() 信号

三、按压按钮控件

  QPushButton 按钮是最常用的按钮,单击按钮后通常完成对话框中的 “确定” “应用” “取消” 和 “帮助” 等功能, QPushButton 还可以设置菜单。

  用 QPushButton 类创建实例对象的方法如下所示:

QPushButton(parent:QWidget=None)
QPushButton(text:str, parent:QWidget=None)
QPushButton(icon:QIcon, text:str, parent:QWidget=None)

  其中 parent窗口 或者 容器类控件textQPushButton显示的文字QIcon图标

  QPushButton 继承自 QAbstractButton,具有 QAbstractButton 的方法。按压按钮 QPushButton 特有的方法如下所示:

# 实例方法
setMenu(menu:QMenu) -> None                                                     # 设置菜单
menu() -> QMenu                                                                 # 获取菜单

setAutoDefault(enable:bool) -> None                                             # 设置按钮是否是自动默认按钮
autoDefault() -> bool                                                           # 获取按钮是否是自动默认按钮
isDefault() -> bool                                                             # 设置按钮是默认按钮,按Entry键发送该按钮信号

setFlat(enable:bool) -> None                                                    # 设置按钮是否没有凸起效果
isFlat() -> bool                                                                # 获取按钮是否没有凸起效果

# 槽函数
showMenu() -> None                                                              # 弹出菜单

  其中 setMenu(QMenu)方法可以为按钮 设置菜单defaultautoDefault 属性是在对话框窗口(QDialog)中有多个按钮情况下,按 Enter 键时,发送哪个按钮的信号。设置 defaultautoDefault 属性时,有下面几种情况。

  • 当焦点在某个按钮上时(用 Tab 键切换焦点),按 Enter 键,则发送有焦点的按钮的信号;若所有按钮的这两个属性值均为 False,且焦点不在任何按钮上,则按 Enter 键时不发送按钮信号。
  • 若某个按钮的 defaultTrue,其他按钮的 defaultFalse,则不管其他按钮的 autoDefault 是否为 True,按 Enter 键时,有 default 的按钮发送信号。
  • 当前所有按钮的 default 属性为 False,并且有一些按钮的 autoDefault 属性为 True,当按 Enter 键时第 1 个设置了 autoDefault 属性的按钮发送信号。
  • 当多个按钮的 default 属性为 True 时,按 Enter 键发送第 1 个 defaultTrue 的按钮的信号。

以上说的第 1 个按钮是指实例化按钮的顺序,而不是设置 defaultautoDefault 的顺序。

  我们新建一个 ui.py 文件,用来存放 UI 相关的代码。

from PySide6.QtWidgets import QWidget
from PySide6.QtWidgets import QLabel, QPushButton
from PySide6.QtWidgets import QVBoxLayout
from PySide6.QtGui import QPixmap

class MyUi:
    def setupUi(self, window:QWidget):
        window.resize(100, 60)                                                  # 1.设置窗口对象大小

        self.button = QPushButton(window)                                       # 2.创建按钮控件
        self.label = QLabel(window)                                             # 3.创建标签控件

        layout = QVBoxLayout(window)                                            # 4.创建垂直布局
        layout.addWidget(self.button)                                           # 5.添加控件到布局中
        layout.addWidget(self.label)
  
        self.button.setIcon(QPixmap("assets/images/icon.ico"))                  # 6.设置按钮控件的图标
        self.button.setText("按钮")                                              # 7.设置按钮控件的显示文本
        self.button.setShortcut("Ctrl+O")                                       # 8.设置按钮的快捷键

  我们新建一个 widget.py 文件,用来存放业务逻辑相关的代码。

import sys

from PySide6.QtWidgets import QApplication, QWidget

from ui import MyUi

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()                                                      # 1.调用父类Qwidget类的__init__()方法
      
        self.__ui = MyUi()
        self.__ui.setupUi(self)                                                 # 2.初始化页面
  
        # 如果槽函数有参数,那么在连接的时候,需要使用lambda表达式来传递参数
        self.__ui.button.pressed.connect(lambda:self.button_pressed(self.__ui.button))      # 3.关联按钮的按下时触发信号
        self.__ui.button.released.connect(lambda:self.button_released(self.__ui.button))    # 4.关联按钮释放时触发信号

    def button_pressed(self, button):
        self.__ui.label.setText(f"你按下了【{button.text()}】按钮")

    def button_released(self, button):
         self.__ui.label.setText(f"你释放了【{button.text()}】按钮")

if __name__ == "__main__":
    app = QApplication(sys.argv)                                                # 1.创建一个QApplication类的实例
    window = MyWidget()                                                         # 2.创建一个窗口
    window.show()                                                               # 3.显示窗口
    sys.exit(app.exec())                                                        # 4.进入程序的主循环,并通过exit函数确保主循环安全结束

四、工具按钮控件

  QToolButton 控件是一个工具控件,它本质上是一个按钮,只是在按钮上提供了默认文本 "..." 和可选的箭头类型。QToolButton 控件的使用方法与 QPushButton 类似,不同的是,QToolButton 控件可以设置工具按钮的显示样式和箭头类型。

  其中,工具的显示样式通过 QToolButton 类的 setToolButtonStyle(style:Qt.ToolButtonStyle) 方法进行设置,主要支持以下 5 种样式:

Qt.ToolButtonStyle.ToolButtonIconOnly                                           # 只显示图标
Qt.ToolButtonStyle.ToolButtonTextOnly                                           # 只显示文本
Qt.ToolButtonStyle.ToolButtonTextBesideIcon                                     # 文本显示在图标的旁边
Qt.ToolButtonStyle.ToolButtonTextUnderIcon                                      # 文本现在在图标的下面
Qt.ToolButtonStyle.ToolButtonFollowStyle                                        # 跟随系统样式

  工具按钮的箭头类型通过 QToolButton 类的 setArrowType(type:Qt.ArrowType) 方法进行设置,主要支持 5 中箭头类型:

Qt.ArrowType.NoArrow                                                            # 没有箭头
Qt.ArrowType.UpArrow                                                            # 向上的箭头
Qt.ArrowType.DownArrow                                                          # 向下的箭头
Qt.ArrowType.LeftArrow                                                          # 向左的箭头
Qt.ArrowType.RightArrow                                                         # 向右的箭头

  修改 ui.py 文件的内容。

from PySide6.QtWidgets import QWidget
from PySide6.QtWidgets import QToolButton
from PySide6.QtGui import Qt

class MyUi:
    def setupUi(self, window:QWidget):
        window.resize(100, 100)                                                 # 1.设置窗口对象大小

        toolButton = QToolButton(window)                                        # 2.创建工具按钮控件对象
        toolButton.resize(100, 50)                                              # 3.设置按钮控件的大小
        toolButton.move(10, 10)                                                 # 4.设置按钮控件的位置

  
        toolButton.setText("按钮")                                               # 5.设置按钮所显示的文本
        toolButton.setShortcut("Ctrl+D")                                        # 6.设置按钮的快捷键
        toolButton.setArrowType(Qt.ArrowType.DownArrow)                         # 7.设置图标按钮的样式
        toolButton.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextUnderIcon)  # 8.设置显示样式

  修改 widget.py 文件的内容。

import sys

from PySide6.QtWidgets import QApplication, QWidget

from ui import MyUi

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()                                                      # 1.调用父类Qwidget类的__init__()方法
        self.__ui = MyUi()
        self.__ui.setupUi(self)                                                # 2.初始化页面

if __name__ == "__main__":
    app = QApplication(sys.argv)                                                # 1.创建一个QApplication类的实例
    window = MyWidget()                                                         # 2.创建一个窗口
    window.show()                                                               # 3.显示窗口
    sys.exit(app.exec())                                                        # 4.进入程序的主循环,并通过exit函数确保主循环安全结束

QToolButton 控件中的箭头图标默认大小为 16×16。如果想要改变箭头图标的大小,可以使用 setIconSize(QtCore.QSize(int width, int height)) 方法来设置;

五、命令链接按钮控件

  命令链接按钮控件 QCommandLinkButton 主要用于由多个对话框构成的向导对话框中,其外观通常类似于平面按钮,但除了普通按钮文本外,它上面还有功能描述性文本。默认情况下,它还会带有一个向右的箭头图标。

  用 QCommandLinkButton 类创建实例对象的方法如下:

QCommandLinkButton(parent:QWidget=None)
QCommandLinkButton(text:str, parent:QWidget=None)
QCommandLinkButton(text:str, description:str, parent:QWidget=None)

  其中 parent窗口 或者 容器类控件textQCommandLinkButton显示的本文descriptionQCommandLinkButton 上的 功能描述性文本

  QCommandLinkButton 类是从 QPushButton 类继承来的,因此有 QPushButton 的所有方法,如 setText(text:str)text()setQIcon(icon:QIcon)setFlat(enable:bool)。另外,QCommandLinkButton 控件可以设置描述性文本,方法是 setDescription(text:str),获取描述文本的方法为 description()QCommandLinkButton 控件的信号和槽函数与 QPushButton 控件的相同。

  我们修改 ui.py 文件的内容。

from PySide6.QtWidgets import QWidget
from PySide6.QtWidgets import QCommandLinkButton
from PySide6.QtCore import QSize

class MyUi:
    def setupUi(self, window:QWidget):
        window.resize(180, 100)                                                 # 1.设置窗口对象大小

        commandLinkButton = QCommandLinkButton("按钮", "这是一个按钮", window)     # 2.创建命令钮控件对象

        commandLinkButton.setGeometry(10, 10, 160, 80)                          # 3.设置按钮控件的位置和尺寸
        commandLinkButton.setIconSize(QSize(30, 30))                            # 4.设置箭头图标的大小

        commandLinkButton.setShortcut("Ctrl+D")                                 # 5.设置按钮的快捷键

六、单选按钮控件

  单选按钮控件 QRadioButton 为用户提供多个选项,一般只能选择一个。在一个容器中如果有多个单选按钮,那么这些按钮一般都是互斥的,选择其中一个单选按钮时,其他按钮都会取消选择。如果只有一个单选按钮可以通过单击该按钮改变其状态;而存在多个按钮时单击选中的按钮无法改变其状态,只能选择其他单击按钮才能改变其选中状态。

  用 QRadioButton 类创建实例对象的方法如下所示:

QRadioButton(parent:QWidget=None)
QRadioButton(text:str, parent:QWidget=None)

  其中 parent窗口 或者 容器类控件text 是 QRadioButton 上 显示的文字

  QRadioButton 是从 QAbstractButton 类继承来的,具有 QAbstractButton 的方法和信号。

  我们修改 ui.py 文件的内容。

from PySide6.QtWidgets import QWidget
from PySide6.QtWidgets import QRadioButton
from PySide6.QtCore import QSize
from PySide6.QtGui import QIcon

class MyUi:
    def setupUi(self, window:QWidget):
        # 1.设置窗口对象大小
        window.resize(300, 60)

        # 2.创建单选按钮控件对象
        radioButton_1 = QRadioButton("男", window)
        radioButton_0 = QRadioButton("女", window)
        radioButton_2 = QRadioButton("保密", window)

        # 3.设置单选按钮控件的位置和尺寸
        radioButton_1.setGeometry(0, 0, 100, 50)
        radioButton_0.setGeometry(100, 0, 100, 50)
        radioButton_2.setGeometry(200, 0, 100, 50)

        # 4.设置按钮图标
        radioButton_1.setIcon(QIcon("assets/images/1.ico"))
        radioButton_0.setIcon(QIcon("assets/images/1.ico"))
        radioButton_2.setIcon(QIcon("assets/images/1.ico"))

        # 5.设置按钮图标大小
        radioButton_1.setIconSize(QSize(15, 15))
        radioButton_0.setIconSize(QSize(15, 15))
        radioButton_2.setIconSize(QSize(15, 15))

        # 6.设置单选按钮默认选中
        radioButton_0.setChecked(True)

        # 7.设置按钮的快捷键
        radioButton_1.setShortcut("1")
        radioButton_0.setShortcut("0")
        radioButton_2.setShortcut("2")

七、复选框控件

  QCheckBox 控件的使用与 QRadioButton 控件类似,但它是为用户提供 “多选多” 的选择。另外,它除了选中和未选中两种状态之外,还提供了第三种状态:半选中。如果需要第三种状态,需要使用 QCheckBox 类的 setTristate(enable:bool=true)方法使其生效,并且可以使用 checkState() 方法查询当前状态。

  QCheckBox 控件的三种状态及其说明如下:

Qt.CheckState.Checked                                                           # 选中
Qt.CheckState.PartiallyChecked                                                  # 半选中
Qt.CheckState.Unchecked                                                         # 未选中

  用 QCheckBox 类创建实例对象的方法如下所示:

QCheckBox(parent:QWidget=None)
QCheckBox(text:str, parent:QWidget=None)

  其中 parent窗口 或者 容器类控件textQRadioButton显示的文字

  QCheckBox 是从 QAbstractButton 类继承来的,具有 QAbstractButton 的方法和信号。复选框特有的方法如下:

etTristate(enable:bool=true) -> None                                            # 设置是否右不确定状态
isTristate() -> bool                                                            # 获取是否有不确定状态
setCheckState(state:Qt.CheckState) -> None                                      # 设置当前的选中状态
checkState() -> int                                                             # 获取当前的选中状态,返回值可以为0、1、2,分别表示没有选中、不确定、选中

  QChechBoxQAbstractButton 多了一个 stateChanged(int) 信号。stateChanged(int) 信号在 状态发生变化时都会发送信号,而 toggled(bool) 信号在 从不确定状态转向确定状态时不发送信号,其它信号相同。

  我们修改 ui.py 文件的内容。

from PySide6.QtWidgets import QWidget
from PySide6.QtWidgets import QCheckBox, QLabel
from PySide6.QtWidgets import QGridLayout
from PySide6.QtCore import QSize, Qt
from PySide6.QtGui import QIcon

class MyUi:
    def setupUi(self, window:QWidget):
        window.resize(300, 60)                                                  # 1.设置窗口对象大小

        layout = QGridLayout(window)                                            # 2.创建栅格布局对象

        self.checkBox_1 = QCheckBox("木之本樱", window)                          # 3.创建复选框控件对象,并添加到布局中
        layout.addWidget(self.checkBox_1, 0, 0)

        self.checkBox_2 = QCheckBox("御坂美琴", window)
        layout.addWidget(self.checkBox_2, 0, 1)

        self.checkBox_3 = QCheckBox("夏娜", window)
        layout.addWidget(self.checkBox_3, 0, 2)

        self.label = QLabel(window)
        layout.addWidget(self.label, 1, 0, 1, 3)

        self.checkBox_1.setIcon(QIcon("assets/images/1.ico"))                   # 4.设置复选框图标
        self.checkBox_2.setIcon(QIcon("assets/images/1.ico"))
        self.checkBox_3.setIcon(QIcon("assets/images/1.ico"))

        self.checkBox_1.setIconSize(QSize(15, 15))                              # 5.设置复选框图标大小
        self.checkBox_2.setIconSize(QSize(15, 15))
        self.checkBox_3.setIconSize(QSize(15, 15))
      
        self.checkBox_1.setTristate(True)                                       # 6.设置复选框可以半选中
      
        self.checkBox_1.setCheckState(Qt.CheckState.Checked)                    # 7.设置复选框状态
        self.checkBox_2.setCheckState(Qt.CheckState.PartiallyChecked)
        self.checkBox_3.setCheckState(Qt.CheckState.Unchecked)

  我们修改 widget.py 文件的内容。

import sys

from PySide6.QtWidgets import QApplication, QWidget

from ui import MyUi

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()                                                      # 1.调用父类Qwidget类的__init__()方法
      
        self.__ui = MyUi()
        self.__ui.setupUi(self)                                                # 2.初始化页面

        self.__ui.checkBox_1.stateChanged.connect(self.checkBox_state_changed)  # 3.关联复选框控件状态切换时触发信号
        self.__ui.checkBox_2.toggled.connect(self.checkBox_toggled)             # 4.关联复选框控件状态翻转时触发信号

    def checkBox_state_changed(self, state):
        if state == 0:
            self.__ui.label.setText("按钮的状态为未选中")
        elif state == 1:
            self.__ui.label.setText("按钮的状态为不确定")
        elif state == 2:
            self.__ui.label.setText("按钮的状态为选中")

    def checkBox_toggled(self, state):
        if state:
            self.__ui.label.setText("选中按钮")
        else:
            self.__ui.label.setText("未选中按钮")

if __name__ == "__main__":
    app = QApplication(sys.argv)                                                # 1.创建一个QApplication类的实例
    window = MyWidget()                                                         # 2.创建一个窗口
    window.show()                                                               # 3.显示窗口
    sys.exit(app.exec())                                                        # 4.进入程序的主循环,并通过exit函数确保主循环安全结束
posted @ 2024-12-23 22:51  星光映梦  阅读(337)  评论(0)    收藏  举报