一、组合框控件
组合框控件主要以列表形式为用户提供选择的项目,用户可以从中选择项。PySide6 中常用的列表类控件主要有 QComboBox(下拉组合框控件)、QFontComBox(字体组合框控件)。
我们可以在终端中使用 pip 安装 pyside6 模块。
pip install pyside6
二、下拉组合框控件
下拉组合框控件可以看成是一个 QLineEdit 和一个 列表控件 的组合体,每行除有必要的文字外,还可以设置图标。当单击下拉列表框时,下拉列表框呈展开状态,显示多行选项供用户选择,根据用户选择的内容发送信号,进行不同的动作。通常下拉列表框处于折叠状态,只显示一行当前内容。QComboBox 除了显示可见的文字和图标外,还可以给每行设置一个关联数据,数据类型任意,可以是字符串、文字、图片、类的实例等。通过客户选择的内容,可以读取关联的数据。
用 QComboBox 类创建实例对象的方法如下。
QComboBox(parent:QWidget=None)
其中 parent 是 窗口 或者 容器类控件 。
QComboBox 由一列多行内容构成,每行称为一个项(item)。QComboBox 的方法主要是有关项的方法,可以添加项、插入项和移除项。
# 实例方法
addItem(text:str, userData:Any=None) -> None # 增加一个选项
addItem(icon:QIcon, text:str, userData:Any=None) -> None # 增加一个选项
addItems(texts:Sequence[str]) -> None # 增加多个选项insertItem(index:int, text:str, userData:Any=None) -> None # 插入一个选项
insertItem(index:int, icon:QIcon, text:str, userData:Any=None) -> None # 插入一个选项
insertItems(index:int, texts:Sequence[str]) -> None # 插入多个选项removeItem(index:int) -> None # 删除一个选项count() -> int # 获取选项数量
currentIndex() -> int # 获取当前选项索引
currentText() -> str # 获取当前选项文本setEditable(editable:bool) -> None # 设置是否可编辑
setIconSize(size:QSize) -> None # 设置图标大小
setInsertPolicy(policy:QComboBox.InsertPolicy) -> None # 设置插入策略
setItemData(index:int, value:Any, role:Qt.ItemDataRole=Qt.UserRole) -> None # 设置选项数据
setItemIcon(index:int, icon:QIcon) -> None # 设置选项图标
setItemText(index:int, text:str) -> None # 设置选项文本
setMaxCount(max:int) -> None # 设置最大选项数量
setMaxVisibleItems(maxItems:int) -> None # 设置最大可见选项数量,超过显示滚动条
setMinimumContentsLength(characters:int) -> None # 设置最小内容长度
setSizeAdjustPolicy(policy:QComboBox.SizeAdjustPolicy) -> None # 设置尺寸调整策略
setValidator(v:QValidator) -> None # 设置验证器currentData(role:Qt.ItemDataRole=Qt.UserRole) -> Any # 获取当前选项数据
iconSize() -> QSize # 获取图标大小
itemIcon(index:int) -> QIcon # 获取选项图标
itemText(index:int) -> str # 获取选项文本
itemData(index:int, role:Qt.ItemDataRole=Qt.UserRole) -> Any # 获取选项数据showPopup() -> None # 显示下拉列表
hidePopup() -> None # 隐藏下拉列表# 槽函数
setCurrentText(text:str) -> None # 设置当前选项文本
setCurrentIndex(index:int) -> None # 设置当前选项索引
setEditText(text:str) -> None # 设置编辑框文本
clear() -> None # 清空选项
clearEditText() -> None # 清空编辑框文本
在 QComboBox 控件中添加项的方法有 addItem(str,userData=None)
、addItem(QIcon,str,userData=None)
和 addItems(Sequence[str])
,前两种只能逐个增加,最后一种可以把一个元素是字符串的迭代序列(列表、元组)加入到 QComboBox 中。前两种在增加项时,可以为项关联任何类型的数据。
在 QComboBox 控件中插入项的方法有 insertItem(index:int,str,userData=None)
、insertItem(index:int,QIcon,str,userData=None)
和 insertItems(index:int,Sequence[str])
。当插入项时,用 setInsertPolicy(QComboBox.InsertPolicy)
方法可以设置插入项的位置,其中 QComboBox.InsertPolicy 的取值如下所示。
QComboBox.InsertPolicy.NoInsert # 不允许插入项
QComboBox.InsertPolicy.InsertAtTop # 在顶部插入项
QComboBox.InsertPolicy.InsertAtBottom # 在底部插入项
QComboBox.InsertPolicy.InsertAtCurrent # 在当前项之前插入项
QComboBox.InsertPolicy.InsertBeforeCurrent # 在当前项之前插入项
QComboBox.InsertPolicy.InsertAfterCurrent # 在当前项之后插入项
QComboBox.InsertPolicy.InsertAlphabetically # 按字母顺序插入项
用 removeItem(index:int)
方法可以从列表中 移除指定索引值的项;用 clear()
方法可以 清除所有的项;用 clearEditText()
方法可以 清除显示的内容,而不影响项。
通过设置 setEditable(True)
,即 QComboBox 是可编辑状态,可以输入文本,按 Enter 键后文本将作为项插入列表中。
在添加和插入项时,可以定义关联的数据,另外也可以用 setItemData(index:int,any,role=Qt.UserRole)
方法为索引号是 int 的项追加关联的数据,数据类型任意。可以为项定义多个关联数据,第 1 个数据的角色值 role=Qt.UserRole(Qt.UserRole 的值为 256),当追加第 2 个关联的数据时,取 role=Qt.UserRole+1,追加第 3个关联的数据时取role=Qt.UserRole+2,依次类推。用 currentData(role=Qt.UserRole+i)
或 itemData(index:int,role=Qt.UserRole+i)
方法获取关联的数据,其中 role=Qt.UserRole+i 表示第 i 个关联数据的索引,i=0,1,2,…。
利用 setSizeAdjustPolicy(QComboBox.SizeAdjustPolicy)
方法可以设置 QComboBox 的宽度和高度根据项的文字的长度进行调整,其中 QComboBox.SizeAdjustPolicy 可以取值如下:
QComboBox.AdjustToContents # 根据内容调整
QComboBox.AdjustToContentsOnFirstShow # 根据第1次显示的内容调整
QComboBox.AdjustToMinimumContentsLengthWithIcon # 根据最小长度调整
QComboBox 控件常用信号及其说明如下:
activated(index:int) # 索引激活时发射信号
currentIndexChanged(index:int) # 当前索引改变时发射信号
currentTextChanged(text:str) # 当前文本改变时发射信号
editTextChanged(text:str) # 编辑文本改变时发射信号
highlighted(index:int) # 高亮显示当前索引的行
textActivated(text:str) # 文本被激活时发射信号
textHighlighted(text:str) # 文本被高亮时发射信号
import sysfrom PySide6.QtGui import QIcon
from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QComboBoxclass MyWidget(QWidget):def __init__(self):# 1.调用父类Qwidget类的__init__()方法super().__init__()# 2.调用setupUi()方法初始化页面self.setup_ui()def setup_ui(self):# 1.设置窗口对象大小self.resize(700, 500)# 2.创建下拉组合框控件对象comboBox = QComboBox(self)comboBox.resize(100, 30)# 3.添加下拉列表项comboBox.addItem("木之本樱")comboBox.addItems(["御坂美琴", "夏娜", "赤瞳", "黑瞳"])# 4.获取选中项的文本和索引print(comboBox.currentText(), comboBox.currentIndex())# 5.获取所有选项的数量print(comboBox.count())# 6.获取指定索引的文本print(comboBox.itemText(2))# 7.设置指定是索引的图标comboBox.setItemIcon(0, QIcon("1.ico"))# 8.允许通过文本框添加数据comboBox.setEditable(True)# 9.设置最大可选项数量,超过部分显示滚动条comboBox.setMaxVisibleItems(3)# 10.定义信号与槽的连接comboBox.currentTextChanged.connect(self.currentTextChanged)comboBox.textActivated.connect(self.textActivated)comboBox.editTextChanged.connect(self.editTextChanged)comboBox.textHighlighted.connect(self.textHighlighted)def currentTextChanged(self, text):print("选择的项改变了,文本内容为:", text)def textActivated(self, text):print(f"【{text}】文本项被激活了")def editTextChanged(self, text):print("你编辑了文本,编辑后的内容为:", text)def textHighlighted(self, text):print(f"你高亮选择了 {text} 文本 ")if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())
三、字体组合框控件
PySide6 专门定义了一个字体下拉列表框控件 QFontComboBox,列表内容是操作系统支持的字体,这个控件主要用在工具栏中,用于选择字体。QFontComboBox 继承自 QComboBox,因此具有 QComboBox 的方法。另外 QFontComboBox 也有自己的方法。
# 实例方法
currentFont() -> QFont # 获取当前字体
setFontFilters(filter:QFontComboBox.FontFilter) -> None # 设置字体列表的过滤器# 槽函数
setCurrentFont(font:QFont) -> None # 设置当前的字体
其中字体过滤器可以取值如下:
QFontComboBox.FontFilter.AllFonts # 所有字体
QFontComboBox.FontFilter.ScalableFonts # 可以自动伸缩的字体
QFontComboBox.FontFilter.NonScalableFonts # 不自动伸缩的字体
QFontComboBox.FontFilter.MonospacedFonts # 等宽字体
QFontComboBox.FontFilter.ProportionalFonts # 比例字体
import sysfrom PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QFontComboBox, QLabel
from PySide6.QtGui import QFontclass MyWidget(QWidget):def __init__(self):# 1.调用父类Qwidget类的__init__()方法super().__init__()# 2.调用setupUi()方法初始化页面self.setup_ui()def setup_ui(self):# 1.设置窗口对象大小self.resize(700, 500)# 4.创建字体组合框框控件对象fontComboBox = QFontComboBox(self)fontComboBox.resize(300, 30)# 6.获取选中项的文本和索引print(fontComboBox.currentText(), fontComboBox.currentIndex())# 7.获取所有选项的数量print(fontComboBox.count())# 8.设置字体组合框中字体样式fontComboBox.setFontFilters(QFontComboBox.FontFilter.AllFonts)# 创建标签组件self.label = QLabel("你好,小樱(Sakura)", self)self.label.setGeometry(0, 50, 150, 30)# 定义信号与槽的连接fontComboBox.currentTextChanged.connect(self.set_font)def set_font(self, font):# 选中的字体print(font)# 为label设置字体self.label.setFont(QFont(font))if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())