11. 组合框控件
一、组合框控件
组合框控件主要以列表形式为用户提供选择的项目,用户可以从中选择项。PySide6 中常用的列表类控件主要有 QComboBox
(下拉组合框控件)、QFontComBox
(字体组合框控件)。
我们可以在终端中使用 pip
安装 PySide6 模块。默认是从国外的主站上下载,因此,我们可能会遇到网络不好的情况导致下载失败。我们可以在 pip
指令后通过 -i
指定国内镜像源下载。
pip install pyside6 -i https://mirrors.aliyun.com/pypi/simple
国内常用的 pip
下载源列表:
- 阿里云 https://mirrors.aliyun.com/pypi/simple
- 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple
- 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple
- 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple
二、下拉组合框控件
下拉组合框控件 可以看成是一个 单行文本框控件 和一个 列表控件 的组合体。当单击下拉列表框时,下拉列表框呈展开状态,显示多行选项供用户选择。通常下拉列表框处于折叠状态,只显示一行当前内容。
用 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
控件常用信号及其说明如下:
activated(index:int) # 索引激活时发射信号
currentIndexChanged(index:int) # 当前索引改变时发射信号
currentTextChanged(text:str) # 当前文本改变时发射信号
editTextChanged(text:str) # 编辑文本改变时发射信号
highlighted(index:int) # 高亮显示当前索引的行
textActivated(text:str) # 文本被激活时发射信号
textHighlighted(text:str) # 文本被高亮时发射信号
在 QComboBox
控件中添加项的方法有 addItem(text:str, userData=None)
、addItem(icon:QIcon, text:str,userData=None)
和 addItems(texts:Sequence[str])
,前两种只能逐个增加,最后一种可以把一个元素是字符串的迭代序列(列表、元组)加入到 QComboBox
中。前两种在增加项时,可以为项关联任何类型的数据。
在 QComboBox
控件中插入项的方法有 insertItem(index:int, text:str,userData=None)
、insertItem(index:int, icon:QIcon, text:str,userData=None)
和 insertItems(index:int, tests:Sequence[str])
。当插入项时,用 setInsertPolicy(policy:QComboBox.InsertPolicy)
方法可以 设置插入项的位置,其中,参数 policy
是 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 键后文本将作为项插入列表中。
利用 setSizeAdjustPolicy(policy:QComboBox.SizeAdjustPolicy)
方法可以 设置 QComboBox
的宽度和高度根据项的文字的长度进行调整,其中参数 policy
是 QComboBox.SizeAdjustPolicy
类型的枚举值,可以取值如下:
QComboBox.AdjustToContents # 根据内容调整
QComboBox.AdjustToContentsOnFirstShow # 根据第1次显示的内容调整
QComboBox.AdjustToMinimumContentsLengthWithIcon # 根据最小长度调整
我们新建一个 ui.py 文件,用来存放 UI 相关的代码。
from PySide6.QtWidgets import QWidget
from PySide6.QtWidgets import QLabel, QComboBox
from PySide6.QtWidgets import QVBoxLayout
from PySide6.QtGui import QIcon
class MyUi:
def setupUi(self, window:QWidget):
window.resize(300, 60) # 1.设置窗口对象大小
self.label = QLabel(window) # 2.创建标签控件对象
self.comboBox = QComboBox(window) # 3.创建下拉列表对象
layout = QVBoxLayout(window) # 4.创建垂直布局对象
layout.addWidget(self.comboBox) # 5.添加控件到布局中
layout.addWidget(self.label)
self.comboBox.setEditable(True) # 6.允许通过文本框添加数据
self.comboBox.setMaxVisibleItems(3) # 7.设置最大可选项数量,超过部分显示滚动条
self.comboBox.addItem("木之本樱") # 8.添加下拉列表项一项数据
self.comboBox.addItems(["御坂美琴", "夏娜", "赤瞳", "黑瞳"]) # 9.添加下拉列表项多个数据
self.comboBox.setItemIcon(0, QIcon("assets/images/1.ico")) # 10.设置指定是索引的图标
# 11.获取选中项的文本和索引,并设置到标签上
text = f"index: {self.comboBox.currentIndex()}, text:{self.comboBox.currentText()}"
self.label.setText(text)
我们新建一个 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.comboBox.textActivated.connect(self.combox_text_activated) # 3.关联下拉组合框控件文本激活时触发信号
self.__ui.comboBox.editTextChanged.connect(self.combox_edit_text_changed) # 4.关联下拉组合框控件文本编辑时触发信号
self.__ui.comboBox.textHighlighted.connect(self.combox_text_highlighted) # 5.关联下拉组合框文本高亮时触发信号
def combox_text_activated(self, text):
self.__ui.label.setText(f"【{text}】文本项被激活了")
def combox_edit_text_changed(self, text):
self.__ui.label.setText(f"你编辑了文本,编辑后的内容为:【{text}】")
def combox_text_highlighted(self, text):
self.__ui.label.setText(f"你高亮选择了【{text}】文本 ")
if __name__ == "__main__":
app = QApplication(sys.argv) # 1.创建一个QApplication类的实例
window = MyWidget() # 2.创建一个窗口
window.show() # 3.显示窗口
sys.exit(app.exec()) # 4.进入程序的主循环,并通过exit函数确保主循环安全结束
三、字体组合框控件
PySide6 专门定义了一个字体下拉列表框控件 QFontComboBox
,列表内容是操作系统支持的字体,这个控件主要用在工具栏中,用于选择字体。QFontComboBox
继承自 QComboBox
,因此具有 QComboBox
的方法。另外 QFontComboBox
也有自己的方法。
# 实例方法
currentFont() -> QFont # 获取当前字体
setFontFilters(filter:QFontComboBox.FontFilter) -> None # 设置字体列表的过滤器
# 槽函数
setCurrentFont(font:QFont) -> None # 设置当前的字体
其中,参数 filter
是 字体过滤器,它是 QFontComboBox.FontFilter
类型的枚举值,可以取值如下:
QFontComboBox.FontFilter.AllFonts # 所有字体
QFontComboBox.FontFilter.ScalableFonts # 可以自动伸缩的字体
QFontComboBox.FontFilter.NonScalableFonts # 不自动伸缩的字体
QFontComboBox.FontFilter.MonospacedFonts # 等宽字体
QFontComboBox.FontFilter.ProportionalFonts # 比例字体
我们修改 ui.py 文件中的内容。
from PySide6.QtWidgets import QWidget
from PySide6.QtWidgets import QLabel, QFontComboBox
from PySide6.QtWidgets import QVBoxLayout
class MyUi:
def setupUi(self, window:QWidget):
window.resize(300, 160) # 1.设置窗口对象大小
self.label = QLabel("你好,小樱(Sakura)", window) # 2.创建标签控件对象
font = self.label.font() # 3.获取标签控件的字体
font.setPointSize(32) # 4.设置标签控件的字体大小
self.label.setFont(font) # 5.设置标签控件的字体
self.fontComboBox = QFontComboBox(window) # 6.创建字体组合框框控件对象
layout = QVBoxLayout(window) # 7.创建垂直布局对象
layout.addWidget(self.fontComboBox) # 8.添加控件到布局中
layout.addWidget(self.label)
self.fontComboBox.setFontFilters(QFontComboBox.FontFilter.AllFonts) # 9.设置字体组合框中字体样式
self.fontComboBox.setMaxVisibleItems(10) # 10.设置最大可选项数量,超过部分显示滚动条
我们修改 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.fontComboBox.currentTextChanged.connect(self.combox_set_font) # 3.关联字体组合框当前文本改变时触发信号
def combox_set_font(self, text:str):
font = self.__ui.label.font() # 1.获取label的字体
font.setFamily(text) # 2.设置字体名称
font.setPointSize(32) # 3.设置字体大小
self.__ui.label.setFont(font) # 4.设置label的字体
if __name__ == "__main__":
app = QApplication(sys.argv) # 1.创建一个QApplication类的实例
window = MyWidget() # 2.创建一个窗口
window.show() # 3.显示窗口
sys.exit(app.exec()) # 4.进入程序的主循环,并通过exit函数确保主循环安全结束