一、按钮控件
PySide6 中按钮分为 push 按钮(按压型)、check 按钮(勾选型)和 toggle 按钮(切换型,多个按钮中只有一个可以选中)。其中,push 按钮有 QPushButton 按钮和 QToolButton 按钮,check 按钮是 QCheckBox 按钮,toggle 按钮是 QRadioButton,它们都继承自 QAbastractButton,除此之外还有个从 QPushButton 继承而来的 QCommandLinkButton 按钮。
我们可以在终端中使用 pip 安装 pyside6 模块。
pip install pyside6
二、抽象按钮
抽象按钮 QAbstractButton 是所有按钮控件的基类,不能直接使用,它为其他按钮提供一些共同的属性和信号。QAbstractButton 为按钮类提共一些共同的属性和方法。
# 实例方法
setText(text:str) -> None # 设置文本
text() -> str # 获取文本
setIcon(icon:Union[QIcon, QPixmap]) -> None # 设置图标
icon() -> QIcon # 获取图标
iconSize() -> QSize # 获取图标大小
setCheckable(arg__1:bool) -> None # 设置是否可选中
isCheckable() -> bool # 获取是否可选中
isChecked() -> bool # 获取是否被选中
setAutoRepeat(arg__1:bool) -> None # 设置是否具有自动重复性
autoRepeat() -> bool # 获取是否具有自动重复性
setAutoRepeatDelay(arg__1:int) -> None # 设置重复执行的延迟时间
autoRepeatDelay() -> int # 获取重复执行的延迟时间
setAutoRepeatInterval(arg__1:int) -> None # 设置重复发送信号的时间间隔
autoRepeatInterval() -> int # 获取重复执行的时间间隔
setAutoExclusive(arg__1:bool) -> None # 设置自动互斥状态,即按钮是否只能被单击一次
autoExclusive() -> bool # 获取是否具有互斥性
setShortcut(key:Union[QKeySequence, QKeySequence.StandardKey ,str]) -> None # 设置快捷键
shortcut() -> QKeySequence # 获取快捷键
setDown(arg__1:bool) -> None # 设置按钮是否按下,若设置为True,则不会发送pressed()或clicked()信号
hitButton(pos:QPoint) -> bool # 如果pos点在按钮内部,则返回True# 槽方法
setIconSize(size:QSize) -> None # 设置图标大小
setChecked(arg__1:bool) -> None # 设置是否被选中
animateClick() -> None # 用代码执行一次按钮被按下动作,发送相应的信号
click() -> None # 用代码执行一次按钮被单击动作,发送相应的信号。如果按钮可以勾选,则勾选状态发生改变
toggle() -> None # 用代码切换按钮的勾选状态
按钮都有 setText(str)
和 setIcon(QIcon)
方法,分别 设置按钮上的文字和图标;用 text()
和 icon()
方法 获取按钮的文字和图标;用 setIconSize(QSize)
方法 设置图标的尺寸。
按钮文字中若有 “&”,则 “&” 后的字母是快捷键,在界面运行时按 Alt+ 字母键会发送按钮的信号,如果要在按钮中显示 “&” 方法,则需要用两个 “&&” 表示一个 “&”。
对于没有文字的按钮,用 setShortcut(str)
或 setShortcut(QKeySequence)
方法 设置快捷键,其中 QKeySequence 是用于 定义快捷键的类,例如用 setShortcut("Ctrl+O") 或 setShortcut(QKeySequence("Ctrl+O")) 表示的快捷键是键盘的 Ctrl 键和 O 键的组合。
快捷键也可以是枚举常量 Qt.Modifier 和常量 Qt.Key 的组合,Qt.Modifier 可取 Qt.SHIFT、Qt.META、Qt.CTRL 或 Qt.ALT,Qt.Key 可取 Qt.Key_A ~ Qt.Key_Z、Qt.Key_0 ~ Qt.Key_9 等,例如 setShortcut(QKeySequence(Qt.CTRL|Qt.ALT|Qt.Key_O)) 表示的快捷键是键盘的 Ctrl 键、Alt 键和 O 键的组合。
也可以使用 QKeySequence 中的标准快捷键枚举常量 QKeySequence.StandardKey 来定义,例如 QKeySequence.Open、QKeySequence.Close、QKeySequence.Cut、QKeySequence.Copy、QKeySequence.Paste、QKeySequence.Print 和 QKeySequence.Find 表示的快捷键分别是 Ctrl+O、Ctrl+F4、Ctrl+X、Ctrl+C、Ctrl+V、Ctrl+P 和 Ctrl+F。
用 setCheckable(bool)
方法可以 设置按钮是否可以进行勾选,如果多个有可勾选的按钮在同一容器中,且setAutoExclusive(bool) 设置为 True,则只能有一个按钮处于选中状态。对于 QCheckBox 按钮 autoExclusive 默认是 False。对 QRadioButton 默认是 True。用 setChecked(bool)
方法 设置按钮是否可以选中,用 isChecked()
方法 获取按钮的 checked 状态。
如果 setAutoRepeat(bool)
设置为 True,则在长时间按住按钮时,每经过固定长度的时间间隔后,信号 pressed()、released() 和 clicked() 就会发送一次,用 setAutoRepeatInterval(int)
方法设置这个时间间隔(毫秒),用 setAutoRepeatDelay(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 是 窗口 或者 容器类控件,text 是 QPushButton 上 显示的文字,QIcon 是 图标。
QPushButton 继承自 QAbstractButton,具有 QAbstractButton 的方法。按压按钮 QPushButton 特有的方法如下所示。
# 实例方法
setMenu(menu:QMenu) -> None # 设置菜单
menu() -> QMenu # 获取菜单
setAutoDefault(arg__1:bool) -> None # 设置按钮是否是自动默认按钮
autoDefault() -> bool # 获取按钮是否是自动默认按钮
isDefault() -> bool # 设置按钮是默认按钮,按Entry键发送该按钮信号
setFlat(arg__1:bool) -> None # 设置按钮是否没有凸起效果
isFlat() -> bool # 获取按钮是否没有凸起效果# 槽函数
showMenu() -> None # 弹出菜单
其中 setMenu(QMenu)
方法可以为按钮 设置菜单,default 和 autoDefault 属性是在对话框窗口(QDialog)中有多个按钮情况下,按 Enter 键时,发送哪个按钮的信号。设置 default 和 autoDefault 属性时,有下面几种情况。
- 当焦点在某个按钮上时(用 Tab 键切换焦点),按 Enter 键,则发送有焦点的按钮的信号;若所有按钮的这两个属性值均为 False,且焦点不在任何按钮上,则按 Enter 键时不发送按钮信号。
- 若某个按钮的 default 为 True,其他按钮的 default 为 False,则不管其他按钮的 autoDefault 是否为 True,按 Enter 键时,有 default 的按钮发送信号。
- 当前所有按钮的 default 属性为 False,并且有一些按钮的 autoDefault 属性为 True,当按 Enter 键时第 1 个设置了 autoDefault 属性的按钮发送信号。
- 当多个按钮的 default 属性为 True 时,按 Enter 键发送第 1 个 default 为 True 的按钮的信号。
以上说的第 1 个按钮是指实例化按钮的顺序,而不是设置 default 或 autoDefault 的顺序。
import sysfrom PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QPushButton
from PySide6.QtGui import QPixmapclass MyWidget(QWidget):def __init__(self):# 1.调用父类Qwidget类的__init__()方法super().__init__()# 2.调用setupUi()方法初始化页面self.setup_ui()def setup_ui(self):# 1.设置窗口对象大小self.setFixedSize(600, 400)# 2.创建按钮控件self.button = QPushButton(self)# 3.设置按钮控件的图标self.button.setIcon(QPixmap("assets/images/icon.ico"))# 4.设置按钮控件的显示文本self.button.setText("按钮1")# 5.设置按钮的快捷键self.button.setShortcut("Ctrl+O")# 6.定义信号与槽的连接# 如果槽函数有参数,那么在连接的时候,需要使用lambda表达式来传递参数self.button.clicked.connect(lambda:self.clicked(self.button))self.button.pressed.connect(self.pressed)self.button.released.connect(self.released)def pressed(self):print(f"你按下了【{self.sender().text()}】按钮")def released(self):print(f"你释放了【{self.sender().text()}】按钮")def clicked(self, button):print(f"你点击了【{button.text()}】按钮")if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())
四、工具按钮控件
QToolButton 控件是一个工具控件,它本质上是一个按钮,只是在按钮上提供了默认文本 "..." 和可选的箭头类型。QToolButton 控件的使用方法与 QPushButton 类似,不同的是,QToolButton 控件可以设置工具按钮的显示样式和箭头类型。
其中,工具的显示样式通过 QToolButton 类的 setToolButtonStyle(style)
方法进行设置,主要支持以下 5 种样式。
Qt.ToolButtonStyle.ToolButtonIconOnly # 只显示图标
Qt.ToolButtonStyle.ToolButtonTextOnly # 只显示文本
Qt.ToolButtonStyle.ToolButtonTextBesideIcon # 文本显示在图标的旁边
Qt.ToolButtonStyle.ToolButtonTextUnderIcon # 文本现在在图标的下面
Qt.ToolButtonStyle.ToolButtonFollowStyle # 跟随系统样式
工具按钮的箭头类型通过 QToolButton 类的 setArrowType(type)
方法进行设置,主要支持 5 中箭头类型。
Qt.ArrowType.NoArrow # 没有箭头
Qt.ArrowType.UpArrow # 向上的箭头
Qt.ArrowType.DownArrow # 向下的箭头
Qt.ArrowType.LeftArrow # 向左的箭头
Qt.ArrowType.RightArrow # 向右的箭头
import sysfrom PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QToolButton
from PySide6.QtCore import Qtclass MyWidget(QWidget):def __init__(self):# 1.调用父类Qwidget类的__init__()方法super().__init__()# 2.调用setupUi()方法初始化页面self.setup_ui()def setup_ui(self):# 1.设置窗口对象大小self.setFixedSize(600, 400)# 2.创建工具按钮控件对象toolButton = QToolButton(self)# 3.设置工具按钮控件的尺寸toolButton.resize(100, 50)# 4.设置按钮所显示的文本toolButton.setText("按钮")# 5.设置按钮的快捷键toolButton.setShortcut("Ctrl+D")# 6.设置显示样式toolButton.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon)# 7.设置图标按钮的样式toolButton.setArrowType(Qt.RightArrow)if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())
ToolButton 控件中的箭头图标默认大小为 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 是 窗口 或者 容器类控件,text 是 QCommandLinkButton 上 显示的本文,description 是 QCommandLinkButton 上的 功能描述性文本。
QCommandLinkButton 类是从 QPushButton 类继承来的,因此有 QPushButton 的所有方法,如 setText(str)、text()、setQIcon(QIcon)、setFlat(bool)。另外,QCommandLinkButton 控件可以设置描述性文本,方法是 setDescription(str)
,获取描述文本的方法为 description()
。QCommandLinkButton 控件的信号和槽函数与 QPushButton 控件的相同。
import sysfrom PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QCommandLinkButton
from PySide6.QtCore import QSizeclass MyWidget(QWidget):def __init__(self):# 1.调用父类Qwidget类的__init__()方法super().__init__()# 2.调用setupUi()方法初始化页面self.setup_ui()def setup_ui(self):# 1.设置窗口对象大小self.setFixedSize(600, 400)# 2.创建命令钮控件对象commandLinkButton = QCommandLinkButton("按钮", "这是一个按钮", self)# 3.设置命令按钮控件的尺寸commandLinkButton.resize(150, 70)# 4.获取按钮所显示的文本print(commandLinkButton.text())# 5.获取功能描述文本print(commandLinkButton.description())# 6.设置箭头图标的大小commandLinkButton.setIconSize(QSize(30, 30))# 7.设置按钮的快捷键commandLinkButton.setShortcut("Ctrl+D")if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())
六、单选按钮控件
单选按钮控件 QRadioButton 为用户提供多个选项,一般只能选择一个。在一个容器中如果有多个单选按钮,那么这些按钮一般都是互斥的,选择其中一个单选按钮时,其他按钮都会取消选择。如果只有一个单选按钮可以通过单击该按钮改变其状态;而存在多个按钮时单击选中的按钮无法改变其状态,只能选择其他单击按钮才能改变其选中状态。
用 QRadioButton 类创建实例对象的方法如下所示。
QRadioButton(parent:QWidget=None)
QRadioButton(text:str, parent:QWidget=None)
其中 parent 是 窗口 或者 容器类控件,text 是 QRadioButton 上 显示的文字。
QRadioButton 是从 QAbstractButton 类继承来的,具有 QAbstractButton 的方法和信号。
import sysfrom PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QRadioButton
from PySide6.QtGui import QIcon
from PySide6.QtCore import QSizeclass MyWidget(QWidget):def __init__(self):# 1.调用父类Qwidget类的__init__()方法super().__init__()# 2.调用setupUi()方法初始化页面self.setup_ui()def setup_ui(self):# 1.设置窗口对象大小self.setFixedSize(600, 400)# 2.创建单选按钮控件对象radioButton_1 = QRadioButton("男", self)radioButton_0 = QRadioButton("女", self)radioButton_2 = QRadioButton("保密", self)# 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("1.ico"))radioButton_0.setIcon(QIcon("1.ico"))radioButton_2.setIcon(QIcon("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")if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())
七、复选框控件
QCheckBox 控件的使用与 QRadioButton 控件类似,但它是为用户提供 “多选多” 的选择。另外,它除了选中和未选中两种状态之外,还提供了第三种状态:半选中。如果需要第三种状态,需要使用 QCheckBox 类的 setTristate(y=true)
方法使其生效,并且可以使用 checkState()
方法查询当前状态。
QCheckBox 控件的三种状态及其说明如下:
Qt.CheckState.Checked # 选中
Qt.CheckState.PartiallyChecked # 半选中
Qt.CheckState.Unchecked # 未选中
用 QCheckBox 类创建实例对象的方法如下所示。
QCheckBox(parent:QWidget=None)
QCheckBox(text:str, parent:QWidget=None)
其中 parent 是 窗口 或者 容器类控件,text 是 QRadioButton 上 显示的文字。
QCheckBox 是从 QAbstractButton 类继承来的,具有 QAbstractButton 的方法和信号。复选框特有的方法如下:
setTristate(y:bool=true) -> None # 设置是否右不确定状态
isTristate() -> bool # 获取是否有不确定状态
setCheckState(state:Qt.CheckState) -> None # 设置当前的选中状态
checkState() -> int # 获取当前的选中状态,返回值可以为0、1、2,分别表示没有选中、不确定、选中
QChechBox 比 QAbstractButton 多了一个 stateChanged(int)
信号。stateChanged(int) 信号在状态发生变化时都会发送信号,而 toggled(bool) 信号在从不确定状态转向确定状态时不发送信号,其他信号相同。
import sysfrom PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QCheckBox
from PySide6.QtGui import QIcon
from PySide6.QtCore import QSize, Qtclass MyWidget(QWidget):def __init__(self):# 1.调用父类Qwidget类的__init__()方法super().__init__()# 2.调用setupUi()方法初始化页面self.setup_ui()def setup_ui(self):# 1.设置窗口对象大小self.setFixedSize(600, 400)# 2.创建复选框控件对象,并指定父窗口checkBox_1 = QCheckBox("木之本樱", self)checkBox_2 = QCheckBox("御坂美琴", self)checkBox_3 = QCheckBox("夏娜", self)# 3.设置复选框控件的位置和尺寸checkBox_1.setGeometry(0, 0, 100, 50)checkBox_2.setGeometry(100, 0, 100, 50)checkBox_3.setGeometry(200, 0, 100, 50)# 4.设置复选框图标checkBox_1.setIcon(QIcon("1.ico"))checkBox_2.setIcon(QIcon("1.ico"))checkBox_3.setIcon(QIcon("1.ico"))# 5.设置复选框图标大小checkBox_1.setIconSize(QSize(15, 15))checkBox_2.setIconSize(QSize(15, 15))checkBox_3.setIconSize(QSize(15, 15))# 6.设置复选框可以半选中checkBox_1.setTristate(True)# 7.设置复选框状态checkBox_1.setCheckState(Qt.Checked)checkBox_2.setCheckState(Qt.CheckState.PartiallyChecked)checkBox_3.setCheckState(Qt.CheckState.Unchecked)# 8.定义信号与槽的连接checkBox_1.stateChanged.connect(self.stateChanged)checkBox_2.toggled.connect(self.toggled)def stateChanged(self, state):if state == 0:print("按钮的状态为未选中")elif state == 1:print("按钮的状态为不确定")elif state == 2:print("按钮的状态为选中")def toggled(self, state):if state:print("选中按钮")else:print("未选中按钮")if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())