python PySide2 combo box (QComboBox )下拉控件

介绍

QComboBox 是 PySide2 中常用的下拉选择组件,它提供了一个下拉列表供用户选择,既可以是静态选项也可以是动态添加的选项。本文将详细介绍 QComboBox 的各种用法和高级特性。

基本用法

创建 QComboBox 并添加选项

import sys
from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QLabel

class ComboBoxExample(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 设置窗口标题和大小
        self.setWindowTitle('QComboBox 基本示例')
        self.setGeometry(300, 300, 300, 200)

        # 创建布局
        layout = QVBoxLayout()

        # 创建标签用于显示选择结果
        self.label = QLabel('请选择一个选项')
        layout.addWidget(self.label)

        # 创建 QComboBox
        self.combo = QComboBox()

        # 添加选项
        self.combo.addItem('选项 1')
        self.combo.addItem('选项 2')
        self.combo.addItem('选项 3')

        # 一次添加多个选项
        self.combo.addItems(['选项 4', '选项 5', '选项 6'])

        # 绑定选择变化事件
        self.combo.currentIndexChanged.connect(self.on_combobox_changed)

        layout.addWidget(self.combo)
        self.setLayout(layout)

    def on_combobox_changed(self, index):
        # 获取当前选择的文本
        selected_text = self.combo.currentText()
        # 获取当前选择的索引
        selected_index = self.combo.currentIndex()
        # 更新标签显示
        self.label.setText(f'选中: {selected_text} (索引: {selected_index})')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = ComboBoxExample()
    ex.show()
    sys.exit(app.exec_())

常用方法

QComboBox 提供了丰富的方法来操作选项:

  1. 添加选项

    • addItem(text, userData=None): 添加单个选项
    • addItems(items): 添加多个选项(接收字符串列表)
  2. 插入选项

    • insertItem(index, text, userData=None): 在指定位置插入选项
    • insertItems(index, items): 在指定位置插入多个选项
  3. 移除选项

    • removeItem(index): 移除指定索引的选项
    • clear(): 清除所有选项
  4. 获取选项信息

    • currentText(): 获取当前选中项的文本
    • currentIndex(): 获取当前选中项的索引
    • itemText(index): 获取指定索引项的文本
    • count(): 获取选项总数
  5. 设置选中项

    • setCurrentIndex(index): 通过索引设置选中项
    • setCurrentText(text): 通过文本设置选中项(需要精确匹配)

带用户数据的 QComboBox

QComboBox 可以为每个选项存储额外的用户数据,这在需要区分显示文本和实际值时非常有用:

import sys
from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QLabel

class ComboBoxWithDataExample(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('带用户数据的 QComboBox')
        self.setGeometry(300, 300, 300, 200)

        layout = QVBoxLayout()

        self.label = QLabel('请选择一个城市')
        layout.addWidget(self.label)

        self.combo = QComboBox()

        # 添加带用户数据的选项(城市名称 -> 邮政编码)
        self.combo.addItem('北京', '100000')
        self.combo.addItem('上海', '200000')
        self.combo.addItem('广州', '510000')
        self.combo.addItem('深圳', '518000')

        # 绑定事件
        self.combo.currentIndexChanged.connect(self.on_combobox_changed)

        layout.addWidget(self.combo)
        self.setLayout(layout)

    def on_combobox_changed(self, index):
        # 获取当前选择的文本
        city = self.combo.currentText()
        # 获取关联的用户数据
        zip_code = self.combo.itemData(index)

        self.label.setText(f'{city} 的邮政编码是: {zip_code}')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = ComboBoxWithDataExample()
    ex.show()
    sys.exit(app.exec_())

可编辑的 QComboBox

QComboBox 可以设置为可编辑状态,允许用户输入自定义文本:

# 设置为可编辑
self.combo.setEditable(True)

# 获取用户输入的文本(包括自定义输入)
input_text = self.combo.currentText()

# 设置编辑框的占位文本
self.combo.setPlaceholderText("请选择或输入...")

信号与事件处理

QComboBox 提供了多个有用的信号:

  1. currentIndexChanged(index): 当选中项的索引发生变化时触发
  2. currentTextChanged(text): 当选中项的文本发生变化时触发
  3. editTextChanged(text): 当可编辑组合框的文本被编辑时触发
# 索引变化时触发
self.combo.currentIndexChanged.connect(self.on_index_changed)

# 文本变化时触发
self.combo.currentTextChanged.connect(self.on_text_changed)

# 编辑文本变化时触发(仅在可编辑模式下有效)
self.combo.editTextChanged.connect(self.on_edit_changed)

高级特性

设置图标

可以为每个选项添加图标:

from PySide2.QtGui import QIcon

# 添加带图标的选项
self.combo.addItem(QIcon("icon1.png"), "选项 1")
self.combo.addItem(QIcon("icon2.png"), "选项 2")

限制可见项目数量

# 设置下拉列表最多显示5个项目,超过则显示滚动条
self.combo.setMaxVisibleItems(5)

过滤和自动完成

在可编辑模式下,可以启用自动完成功能:

import sys
from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QLabel

class ComboBoxAutoCompleteExample(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('QComboBox 自动完成示例')
        self.setGeometry(300, 300, 300, 200)

        layout = QVBoxLayout()

        self.label = QLabel('请输入或选择一个编程语言:')
        layout.addWidget(self.label)

        self.combo = QComboBox()
        # 设置为可编辑
        self.combo.setEditable(True)

        # 添加编程语言选项
        languages = [
            'Python', 'Java', 'C++', 'C#', 'JavaScript',
            'Ruby', 'Go', 'Swift', 'Kotlin', 'PHP',
            'Perl', 'Rust', 'TypeScript', 'Dart'
        ]
        self.combo.addItems(languages)

        # 设置自动完成模式
        self.combo.setCompletionMode(QComboBox.PopupCompletion)
        # 使用内置的完成器
        self.completer = self.combo.completer()
        # 设置过滤模式:匹配开头
        self.completer.setFilterMode(Qt.MatchStartsWith)

        # 绑定事件
        self.combo.currentTextChanged.connect(self.on_text_changed)

        layout.addWidget(self.combo)
        self.setLayout(layout)

    def on_text_changed(self, text):
        self.label.setText(f'当前输入: {text}')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = ComboBoxAutoCompleteExample()
    ex.show()
    sys.exit(app.exec_())

常见问题及解决方案

  1. 问题:设置了 setCurrentText() 但没有效果
    解决:确保要设置的文本在选项列表中存在,或者组合框处于可编辑模式

  2. 问题:无法获取用户输入的自定义文本
    解决:确保组合框已设置为可编辑模式 setEditable(True)

  3. 问题:选项太多,下拉列表太长
    解决:使用 setMaxVisibleItems(n) 限制可见项目数量

  4. 问题:需要根据输入过滤选项
    解决:使用可编辑模式配合自定义的 QCompleter 实现高级过滤

QComboBox 是一个非常灵活的组件,通过上述方法可以满足大多数下拉选择的需求。在实际开发中,结合用户数据和信号处理,可以实现更复杂的交互逻辑。


原文出处:/show_1GW1ss1R8O4t.html