11. 组合框控件

一、组合框控件

  组合框控件主要以列表形式为用户提供选择的项目,用户可以从中选择项。PySide6 中常用的列表类控件主要有 QComboBox(下拉组合框控件)、QFontComBox(字体组合框控件)。

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

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

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

组合框类控件

二、下拉组合框控件

  下拉组合框控件 可以看成是一个 单行文本框控件 和一个 列表控件 的组合体。当单击下拉列表框时,下拉列表框呈展开状态,显示多行选项供用户选择。通常下拉列表框处于折叠状态,只显示一行当前内容。

  用 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) 方法可以 设置插入项的位置,其中,参数 policyQComboBox.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 的宽度和高度根据项的文字的长度进行调整,其中参数 policyQComboBox.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函数确保主循环安全结束
posted @ 2024-12-29 19:50  星光映梦  阅读(388)  评论(0)    收藏  举报