<think>我们接下来要讨论PyQt中的QComboBox组件。QComboBox是一个下拉选择框,允许用户从预定义的选项列表中选择一个或多个选项(当设置为可编辑时,用户还可以输入自定义文本)。下面将详细介绍QComboBox的使用方法、常用功能以及一个完整的示例代码。## QComboBox的主要功能1. **基本下拉选择**:提供一组选项供用户选择2.**可编辑模式**:允许用户输入自定义文本3.**图标支持**:每个选项可以关联图标4.**数据存储**:每个选项可以关联自定义数据(通过setItemData)5.**信号机制**:当选择改变时发出currentIndexChanged信号##完整示例代码```pythonimport sysfromPyQt5.QtWidgets import(QApplication,QMainWindow,QComboBox,QLabel,QVBoxLayout, QWidget,QPushButton,QLineEdit, QFormLayout)
fromPyQt5.QtCoreimport QtfromPyQt5.QtGuiimport QIconclass ComboBoxDemo(QMainWindow):def__init__(self):super().__init__()#设置窗口self.setWindowTitle("QComboBox示例")self.setGeometry(300,300,400,300)#创建中央部件central_widget= QWidget()self.setCentralWidget(central_widget)#主布局layout =QVBoxLayout(central_widget)#创建表单布局用于显示控件form_layout= QFormLayout()layout.addLayout(form_layout)#1.基本下拉框self.combo_basic =QComboBox()self.combo_basic.addItem("选项1")self.combo_basic.addItem("选项2")self.combo_basic.addItem("选项3")self.combo_basic.addItem("选项4")self.combo_basic.currentIndexChanged.connect(self.on_basic_combo_changed)form_layout.addRow("基本下拉框:", self.combo_basic)#显示基本下拉框当前选择self.label_basic= QLabel("当前选择:选项1")form_layout.addRow(self.label_basic)#2.带图标的下拉框self.combo_icon= QComboBox()self.combo_icon.addItem(QIcon("icons/python.png"),"Python")self.combo_icon.addItem(QIcon("icons/java.png"),"Java")self.combo_icon.addItem(QIcon("icons/cpp.png"), "C++")self.combo_icon.addItem(QIcon("icons/js.png"),"JavaScript")self.combo_icon.currentIndexChanged.connect(self.on_icon_combo_changed)form_layout.addRow("带图标下拉框:",self.combo_icon)#3.可编辑下拉框self.combo_editable =QComboBox()self.combo_editable.setEditable(True)self.combo_editable.addItems(["北京", "上海","广州", "深圳"])self.combo_editable.setCurrentIndex(-1)#清空当前选择self.combo_editable.currentTextChanged.connect(self.on_editable_combo_changed)form_layout.addRow("可编辑下拉框:",self.combo_editable)#4.带用户数据的下拉框self.combo_data= QComboBox()self.combo_data.addItem("红色", "color_red")self.combo_data.addItem("绿色", "color_green")self.combo_data.addItem("蓝色","color_blue")self.combo_data.currentIndexChanged.connect(self.on_data_combo_changed)form_layout.addRow("带数据下拉框:", self.combo_data)#5.按钮:添加新选项self.btn_add= QPushButton("添加新选项")self.btn_add.clicked.connect(self.add_new_item)layout.addWidget(self.btn_add)#6.按钮:移除选中选项self.btn_remove= QPushButton("移除选中选项")self.btn_remove.clicked.connect(self.remove_selected_item)layout.addWidget(self.btn_remove)#7.输入框用于添加新选项self.input_new_item= QLineEdit()self.input_new_item.setPlaceholderText("输入新选项")layout.addWidget(self.input_new_item)#状态标签self.status_label =QLabel()layout.addWidget(self.status_label)#初始化状态self.update_status()defon_basic_combo_changed(self, index):self.label_basic.setText(f"当前选择: {self.combo_basic.currentText()}")defon_icon_combo_changed(self, index):self.status_label.setText(f"选择了:{self.combo_icon.currentText()}")defon_editable_combo_changed(self,text):self.status_label.setText(f"输入/选择了: {text}")def on_data_combo_changed(self, index):#获取关联的用户数据user_data= self.combo_data.currentData()self.status_label.setText(f"选择:{self.combo_data.currentText()},数据:{user_data}")def add_new_item(self):new_text =self.input_new_item.text().strip()ifnew_text:#添加到所有下拉框self.combo_basic.addItem(new_text)self.combo_icon.addItem(QIcon("icons/default.png"), new_text)self.combo_editable.addItem(new_text)self.combo_data.addItem(new_text,f"custom_{new_text}")self.status_label.setText(f"已添加: {new_text}")self.input_new_item.clear()else:self.status_label.setText("请输入选项文本")defremove_selected_item(self):#从所有下拉框中移除当前选中的项idx_basic =self.combo_basic.currentIndex()ifidx_basic >=0:self.combo_basic.removeItem(idx_basic)idx_icon =self.combo_icon.currentIndex()ifidx_icon >=0:self.combo_icon.removeItem(idx_icon)idx_editable= self.combo_editable.currentIndex()if idx_editable >=0:self.combo_editable.removeItem(idx_editable)idx_data= self.combo_data.currentIndex()ifidx_data>=0:self.combo_data.removeItem(idx_data)self.update_status()def update_status(self):count_basic =self.combo_basic.count()count_icon =self.combo_icon.count()count_editable= self.combo_editable.count()count_data= self.combo_data.count()self.status_label.setText(f"选项数量:基本={count_basic},图标={count_icon},可编辑={count_editable},数据={count_data}")if __name__== "__main__":app= QApplication(sys.argv)#设置应用程序样式(可选)#app.setStyle("Fusion")window= ComboBoxDemo()window.show()sys.exit(app.exec_())```
##关键功能详解###1.创建和添加选项```python#创建下拉框combo= QComboBox()
#逐个添加选项combo.addItem("选项1")
combo.addItem("选项2")
#添加带图标的选项combo.addItem(QIcon("icon.png"), "带图标的选项")
#批量添加选项combo.addItems(["选项3", "选项4", "选项5"])#添加带用户数据的选项combo.addItem("红色", "color_red")#"红色"是显示文本,"color_red"是关联数据```###2.可编辑模式```python#设置为可编辑combo.setEditable(True)
#设置占位文本combo.setPlaceholderText("请选择或输入...")
#设置编辑框的完成器(自动补全)
combo.completer().setCompletionMode(QCompleter.PopupCompletion)
```###3.信号处理```python#当前索引改变信号combo.currentIndexChanged.connect(handler_function)
#当前文本改变信号(特别适用于可编辑模式)
combo.currentTextChanged.connect(handler_function)
#激活信号(用户选择或输入后确认)
combo.activated.connect(handler_function)```
###4.获取数据```python#获取当前选项索引current_index =combo.currentIndex()#获取当前显示文本current_text= combo.currentText()
#获取当前选项关联的用户数据user_data= combo.currentData()
#获取指定索引的文本text=combo.itemText(index)
#获取指定索引的用户数据data =combo.itemData(index)
```###5.高级功能```python#设置最大可见项数combo.setMaxVisibleItems(5)#插入选项combo.insertItem(2,"插入的选项")#移除选项combo.removeItem(index)
#清空所有选项combo.clear()#设置当前索引(无选项时设为-1)
combo.setCurrentIndex(-1)
#设置当前文本(可编辑模式下)combo.setCurrentText("自定义文本")#设置模型(用于自定义数据模型)
combo.setModel(model)
```##常见应用场景###1.国家/地区选择器```python#从文件或数据库加载国家列表countries= ["中国","美国", "日本","英国", "德国","法国"]combo_country= QComboBox()
combo_country.addItems(countries)combo_country.setCurrentText("中国")#默认选择中国```
###2.动态过滤的下拉框```python#当输入时动态过滤选项classFilterComboBox(QComboBox):def __init__(self,parent=None):super().__init__(parent)self.setEditable(True)self.completer().setCompletionMode(QCompleter.PopupCompletion)self.lineEdit().textEdited.connect(self.filterItems)def filterItems(self, text):#获取所有原始选项all_items =[self.itemText(i) fori inrange(self.count())]#过滤匹配项filtered =[itemfor itemin all_items iftext.lower() initem.lower()]#更新下拉框选项self.clear()self.addItems(filtered)self.showPopup()```
###3.带自定义渲染的下拉框```python#自定义选项渲染classCustomComboBox(QComboBox):def __init__(self,parent=None):super().__init__(parent)def paintEvent(self, event):#自定义绘制逻辑pass#或者使用委托classCustomDelegate(QStyledItemDelegate):defpaint(self, painter, option, index):#自定义绘制每个选项passcombo =QComboBox()delegate= CustomDelegate()combo.setItemDelegate(delegate)```
##常见问题解决###问题1:可编辑模式下无法获取正确选项**解决**:使用`currentText()`而不是`currentIndex()`
###问题2:选项更新后界面不刷新**解决**:在修改选项后调用`combo.update()`或`combo.repaint()`
###问题3:自定义数据显示问题**解决**:确保使用`setItemData`时数据是可序列化的,或者重写`data()`方法###问题4:下拉框弹出位置错误**解决**:调整下拉框的弹出方向```pythoncombo.setStyleSheet("combobox-popup:0;")#强制向下弹出```
###问题5:大量选项导致性能问题**解决**:
1.使用分页加载2.使用延迟加载3.使用QCompleter实现自动完成##最佳实践1. **合理使用用户数据**:将数据库ID等关键信息存储在用户数据中2. **分组显示**:使用`QStandardItemModel`实现分组显示```pythonmodel =QStandardItemModel()group1= QStandardItem("Group1")item1 =QStandardItem("Item1")model.appendRow(group1)model.appendRow(item1)combo.setModel(model)```
3. **验证用户输入**:对可编辑下拉框的输入进行验证```pythoncombo.lineEdit().setValidator(QIntValidator(0,100, self))```
4. **样式定制**:使用QSS美化下拉框```pythoncombo.setStyleSheet("""QComboBox {border:1pxsolid #ccc;border-radius:3px;padding:5px;}QComboBox::drop-down{subcontrol-origin: padding;subcontrol-position:top right;width:20px;border-left:1px solid#ccc;}""")```---
§§相关问题§§:
1.如何在QComboBox中实现选项分组显示?
2.如何对QComboBox的可编辑内容进行输入验证?3.如何使用QCompleter增强QComboBox的自动完成功能?4.如何自定义QComboBox的下拉选项的显示样式(如不同颜色、字体)?</think># PyQt QComboBox 详解
QComboBox 是 PyQt 中常用的下拉选择框组件,它允许用户从预定义的选项列表中选择一个或多个选项。下面我将详细介绍 QComboBox 的使用方法、高级功能以及实际应用场景。
## QComboBox 核心功能实现代码
```python
import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QComboBox, QLabel,
QVBoxLayout, QWidget, QPushButton, QLineEdit,
QCheckBox, QFormLayout, QGroupBox, QHBoxLayout)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon, QFont
class ComboBoxDemo(QMainWindow):
def __init__(self):
super().__init__()
# 设置窗口属性
self.setWindowTitle("QComboBox 高级示例")
self.setGeometry(300, 300, 600, 500)
# 创建中央部件
central_widget = QWidget()
self.setCentralWidget(central_widget)
# 主布局
main_layout = QVBoxLayout(central_widget)
# 1. 基本下拉框
basic_group = QGroupBox("基本功能")
basic_layout = QFormLayout(basic_group)
self.combo_basic = QComboBox()
self.combo_basic.addItem("选项1")
self.combo_basic.addItem("选项2")
self.combo_basic.addItem("选项3")
self.combo_basic.addItem("选项4")
self.combo_basic.currentIndexChanged.connect(self.on_basic_combo_changed)
self.label_basic = QLabel("当前选择: 选项1")
basic_layout.addRow("基本下拉框:", self.combo_basic)
basic_layout.addRow("当前选择:", self.label_basic)
# 2. 带图标的下拉框
icon_group = QGroupBox("带图标的下拉框")
icon_layout = QFormLayout(icon_group)
self.combo_icon = QComboBox()
self.combo_icon.addItem(QIcon("icons/python.png"), "Python")
self.combo_icon.addItem(QIcon("icons/java.png"), "Java")
self.combo_icon.addItem(QIcon("icons/cpp.png"), "C++")
self.combo_icon.addItem(QIcon("icons/js.png"), "JavaScript")
self.combo_icon.currentIndexChanged.connect(self.on_icon_combo_changed)
self.label_icon = QLabel("当前选择: Python")
icon_layout.addRow("语言选择:", self.combo_icon)
icon_layout.addRow("当前选择:", self.label_icon)
# 3. 可编辑下拉框
editable_group = QGroupBox("可编辑下拉框")
editable_layout = QFormLayout(editable_group)
self.combo_editable = QComboBox()
self.combo_editable.setEditable(True)
self.combo_editable.addItems(["北京", "上海", "广州", "深圳"])
self.combo_editable.setCurrentIndex(-1) # 清空当前选择
self.combo_editable.currentTextChanged.connect(self.on_editable_combo_changed)
self.combo_editable.setPlaceholderText("请选择或输入城市...")
self.label_editable = QLabel("当前值: ")
editable_layout.addRow("城市选择:", self.combo_editable)
editable_layout.addRow("当前值:", self.label_editable)
# 4. 多选下拉框
multi_group = QGroupBox("多选下拉框 (自定义实现)")
multi_layout = QVBoxLayout(multi_group)
self.combo_multi = QComboBox()
self.combo_multi.setMinimumWidth(200)
# 创建多选模型
self.multi_items = ["苹果", "香蕉", "橙子", "葡萄", "西瓜"]
self.selected_items = []
# 添加选项
for item in self.multi_items:
self.combo_multi.addItem(item)
# 添加自定义视图
self.combo_multi.setView(QListView()) # 使用QListView支持多选
self.combo_multi.view().setSelectionMode(QAbstractItemView.MultiSelection)
self.combo_multi.view().selectionModel().selectionChanged.connect(self.on_multi_selection_changed)
# 显示选择的项目
self.label_multi = QLabel("已选择: ")
multi_layout.addWidget(self.combo_multi)
multi_layout.addWidget(self.label_multi)
# 5. 动态管理下拉框
dynamic_group = QGroupBox("动态管理下拉框")
dynamic_layout = QFormLayout(dynamic_group)
self.input_new_item = QLineEdit()
self.input_new_item.setPlaceholderText("输入新选项")
self.btn_add = QPushButton("添加选项")
self.btn_add.clicked.connect(self.add_item)
self.btn_remove = QPushButton("移除选中项")
self.btn_remove.clicked.connect(self.remove_item)
self.btn_clear = QPushButton("清空所有选项")
self.btn_clear.clicked.connect(self.clear_items)
# 选择要操作的下拉框
self.combo_target = QComboBox()
self.combo_target.addItems(["基本下拉框", "带图标下拉框", "可编辑下拉框", "多选下拉框"])
# 布局
dynamic_layout.addRow("目标下拉框:", self.combo_target)
dynamic_layout.addRow("新选项:", self.input_new_item)
dynamic_layout.addRow("操作:", self.btn_add)
dynamic_layout.addRow("", self.btn_remove)
dynamic_layout.addRow("", self.btn_clear)
# 添加到主布局
main_layout.addWidget(basic_group)
main_layout.addWidget(icon_group)
main_layout.addWidget(editable_group)
main_layout.addWidget(multi_group)
main_layout.addWidget(dynamic_group)
# 状态标签
self.status_label = QLabel("就绪")
main_layout.addWidget(self.status_label)
# 信号处理函数
def on_basic_combo_changed(self, index):
text = self.combo_basic.itemText(index)
self.label_basic.setText(f"当前选择: {text}")
self.status_label.setText(f"基本下拉框选择了: {text}")
def on_icon_combo_changed(self, index):
text = self.combo_icon.itemText(index)
self.label_icon.setText(f"当前选择: {text}")
self.status_label.setText(f"图标下拉框选择了: {text}")
def on_editable_combo_changed(self, text):
self.label_editable.setText(f"当前值: {text}")
self.status_label.setText(f"可编辑下拉框值: {text}")
def on_multi_selection_changed(self, selected, deselected):
# 获取所有选中的索引
indexes = self.combo_multi.view().selectionModel().selectedIndexes()
# 获取选中的文本
self.selected_items = [self.combo_multi.itemText(i.row()) for i in indexes]
# 更新显示
if self.selected_items:
self.label_multi.setText(f"已选择: {', '.join(self.selected_items)}")
else:
self.label_multi.setText("已选择: 无")
self.status_label.setText(f"多选下拉框选择了: {len(self.selected_items)}项")
# 动态管理函数
def add_item(self):
new_text = self.input_new_item.text().strip()
if not new_text:
self.status_label.setText("错误: 请输入选项文本")
return
target = self.combo_target.currentText()
if target == "基本下拉框":
self.combo_basic.addItem(new_text)
self.status_label.setText(f"已添加 '{new_text}' 到基本下拉框")
elif target == "带图标下拉框":
self.combo_icon.addItem(QIcon("icons/default.png"), new_text)
self.status_label.setText(f"已添加带图标的 '{new_text}'")
elif target == "可编辑下拉框":
self.combo_editable.addItem(new_text)
self.status_label.setText(f"已添加 '{new_text}' 到可编辑下拉框")
elif target == "多选下拉框":
self.combo_multi.addItem(new_text)
self.multi_items.append(new_text)
self.status_label.setText(f"已添加 '{new_text}' 到多选下拉框")
self.input_new_item.clear()
def remove_item(self):
target = self.combo_target.currentText()
if target == "基本下拉框":
index = self.combo_basic.currentIndex()
if index >= 0:
text = self.combo_basic.itemText(index)
self.combo_basic.removeItem(index)
self.status_label.setText(f"已从基本下拉框移除: {text}")
else:
self.status_label.setText("错误: 请先选择一个选项")
elif target == "带图标下拉框":
index = self.combo_icon.currentIndex()
if index >= 0:
text = self.combo_icon.itemText(index)
self.combo_icon.removeItem(index)
self.status_label.setText(f"已从图标下拉框移除: {text}")
else:
self.status_label.setText("错误: 请先选择一个选项")
elif target == "可编辑下拉框":
index = self.combo_editable.currentIndex()
if index >= 0:
text = self.combo_editable.itemText(index)
self.combo_editable.removeItem(index)
self.status_label.setText(f"已从可编辑下拉框移除: {text}")
else:
self.status_label.setText("错误: 请先选择一个选项")
elif target == "多选下拉框":
if self.selected_items:
for item in self.selected_items[:]:
index = self.combo_multi.findText(item)
if index >= 0:
self.combo_multi.removeItem(index)
self.multi_items.remove(item)
self.status_label.setText(f"已从多选下拉框移除 {len(self.selected_items)} 项")
self.selected_items = []
self.label_multi.setText("已选择: 无")
else:
self.status_label.setText("错误: 请先选择要移除的选项")
def clear_items(self):
target = self.combo_target.currentText()
if target == "基本下拉框":
self.combo_basic.clear()
self.label_basic.setText("当前选择: ")
self.status_label.setText("已清空基本下拉框")
elif target == "带图标下拉框":
self.combo_icon.clear()
self.label_icon.setText("当前选择: ")
self.status_label.setText("已清空图标下拉框")
elif target == "可编辑下拉框":
self.combo_editable.clear()
self.label_editable.setText("当前值: ")
self.status_label.setText("已清空可编辑下拉框")
elif target == "多选下拉框":
self.combo_multi.clear()
self.multi_items = []
self.selected_items = []
self.label_multi.setText("已选择: 无")
self.status_label.setText("已清空多选下拉框")
if __name__ == "__main__":
app = QApplication(sys.argv)
# 设置应用程序样式 (可选)
# app.setStyle("Fusion")
window = ComboBoxDemo()
window.show()
sys.exit(app.exec_())
```
## QComboBox 核心功能详解
### 1. 基本用法
```python
# 创建下拉框
combo = QComboBox()
# 添加选项
combo.addItem("选项1")
combo.addItem("选项2")
combo.addItem("选项3")
# 批量添加选项
combo.addItems(["选项4", "选项5", "选项6"])
# 获取当前选择
current_index = combo.currentIndex()
current_text = combo.currentText()
# 信号处理
combo.currentIndexChanged.connect(handler_function)
```
### 2. 带图标的下拉框
```python
# 添加带图标的选项
combo.addItem(QIcon("path/to/icon.png"), "带图标的选项")
# 设置默认图标大小
combo.setIconSize(QSize(24, 24))
```
### 3. 可编辑下拉框
```python
# 设置为可编辑
combo.setEditable(True)
# 设置占位文本
combo.setPlaceholderText("请输入或选择...")
# 设置自动补全
combo.setCompleter(QCompleter(["选项1", "选项2", "选项3"]))
# 获取编辑框内容
text = combo.currentText()
```
### 4. 多选下拉框(自定义实现)
```python
# 使用QListView支持多选
combo.setView(QListView())
# 设置多选模式
combo.view().setSelectionMode(QAbstractItemView.MultiSelection)
# 监听选择变化
combo.view().selectionModel().selectionChanged.connect(handler_function)
# 获取所有选中的项
indexes = combo.view().selectionModel().selectedIndexes()
selected_items = [combo.itemText(i.row()) for i in indexes]
```
### 5. 动态管理选项
```python
# 插入选项
combo.insertItem(index, "新选项")
# 移除选项
combo.removeItem(index)
# 清空所有选项
combo.clear()
# 查找选项索引
index = combo.findText("搜索文本", Qt.MatchFixedString)
```
## 高级功能与技巧
### 1. 数据关联
```python
# 为每个选项关联自定义数据
combo.addItem("选项1", user_data="data1")
combo.addItem("选项2", user_data="data2")
# 获取当前选项关联的数据
current_data = combo.currentData()
```
### 2. 自定义渲染
```python
# 自定义下拉框项渲染
class CustomDelegate(QStyledItemDelegate):
def paint(self, painter, option, index):
# 自定义绘制逻辑
if index.row() % 2 == 0:
painter.fillRect(option.rect, QColor(240, 240, 240))
super().paint(painter, option, index)
# 应用自定义委托
combo.setItemDelegate(CustomDelegate())
```
### 3. 验证输入
```python
# 为可编辑下拉框添加验证器
validator = QIntValidator(0, 100, self)
combo.lineEdit().setValidator(validator)
```
### 4. 样式定制 (QSS)
```python
# 自定义下拉框样式
combo.setStyleSheet("""
QComboBox {
border: 1px solid #ccc;
border-radius: 4px;
padding: 5px;
background-color: white;
}
QComboBox::drop-down {
subcontrol-origin: padding;
subcontrol-position: top right;
width: 20px;
border-left: 1px solid #ccc;
}
QComboBox::down-arrow {
image: url(down_arrow.png);
}
QComboBox QAbstractItemView {
background-color: white;
selection-background-color: #4a90e2;
selection-color: white;
}
""")
```
### 5. 模型/视图框架
```python
# 使用自定义模型
model = QStandardItemModel()
item1 = QStandardItem("选项1")
item2 = QStandardItem("选项2")
model.appendRow(item1)
model.appendRow(item2)
combo.setModel(model)
```
## 常见问题解决方案
### 问题1:下拉框选项显示不全
**原因**:选项内容过长或下拉框宽度不足
**解决**:
```python
# 设置下拉框最小宽度
combo.setMinimumWidth(200)
# 设置下拉列表最小宽度
combo.setMinimumContentsLength(20) # 字符数
# 使用自定义委托调整显示
class ElideDelegate(QStyledItemDelegate):
def paint(self, painter, option, index):
text = index.data(Qt.DisplayRole)
painter.drawText(option.rect, Qt.AlignVCenter,
option.fontMetrics.elidedText(text, Qt.ElideRight, option.rect.width()))
combo.setItemDelegate(ElideDelegate())
```
### 问题2:可编辑模式下无法添加新选项
**解决**:
```python
# 监听编辑完成信号
combo.editTextChanged.connect(self.on_edit_text_changed)
def on_edit_text_changed(self, text):
if text and combo.findText(text) == -1:
combo.addItem(text)
```
### 问题3:多选下拉框的选中状态显示问题
**解决**:
```python
# 自定义委托显示选中状态
class MultiSelectDelegate(QStyledItemDelegate):
def paint(self, painter, option, index):
# 检查是否选中
if option.state & QStyle.State_Selected:
option.font.setBold(True)
option.palette.setColor(QPalette.Text, QColor("blue"))
super().paint(painter, option, index)
```
### 问题4:动态更新选项后索引错误
**解决**:
```python
# 在修改选项前保存当前选择
current_text = combo.currentText()
# 更新选项后恢复选择
if current_text:
index = combo.findText(current_text)
if index >= 0:
combo.setCurrentIndex(index)
```
### 问题5:下拉框性能问题(大量选项)
**解决**:
```python
# 使用延迟加载
combo.setModel(None) # 先清空模型
# 后台加载数据
def load_data():
items = get_large_data() # 获取大量数据
model = QStandardItemModel()
for item in items:
model.appendRow(QStandardItem(item))
combo.setModel(model)
# 在单独线程中加载
QTimer.singleShot(0, load_data)
```
## 实际应用场景
### 1. 国家/地区选择器
```python
# 从文件加载国家列表
with open("countries.txt", "r") as f:
countries = [line.strip() for line in f]
country_combo = QComboBox()
country_combo.addItems(countries)
country_combo.setCurrentText("中国") # 默认选择
```
### 2. 日期选择器
```python
# 年份选择
year_combo = QComboBox()
year_combo.addItems([str(y) for y in range(1900, 2024)])
# 月份选择
month_combo = QComboBox()
month_combo.addItems([f"{m}月" for m in range(1, 13)])
# 日期选择
day_combo = QComboBox()
day_combo.addItems([str(d) for d in range(1, 32)])
```
### 3. 动态筛选器
```python
# 主类别选择
category_combo = QComboBox()
category_combo.addItems(["电子产品", "服装", "食品", "书籍"])
# 子类别选择(动态更新)
subcategory_combo = QComboBox()
def update_subcategories(category):
subcategory_combo.clear()
if category == "电子产品":
subcategory_combo.addItems(["手机", "电脑", "相机"])
elif category == "服装":
subcategory_combo.addItems(["男装", "女装", "童装"])
# ...
category_combo.currentTextChanged.connect(update_subcategories)
```
### 4. 主题选择器
```python
theme_combo = QComboBox()
theme_combo.addItem("默认主题", "default")
theme_combo.addItem("暗色主题", "dark")
theme_combo.addItem("蓝色主题", "blue")
theme_combo.currentIndexChanged.connect(lambda i:
apply_theme(theme_combo.itemData(i)))
```
---