10. 组合框控件

一、组合框控件

  组合框控件主要以列表形式为用户提供选择的项目,用户可以从中选择项。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 sys

from PySide6.QtGui import QIcon
from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QComboBox

class 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 sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QFontComboBox, QLabel
from PySide6.QtGui import QFont

class 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())
posted @   星光映梦  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示