QComboBox是PyQt5中一个集按钮和下拉选项于一体的控件,通常被称为下拉列表框或组合框。它允许用户从预定义的选项列表中选择一个值,是GUI开发中最常用的输入控件之一。
主要特点:
以下是QComboBox最常用的方法及其功能说明:
方法 | 描述 |
---|---|
addItem() | 添加一个下拉选项 |
addItems() | 从列表中添加下拉选项 |
Clear() | 删除下拉选项集合中的所有选 |
count() | 返回下拉选项集合中的数目 |
currentText() | 返回选中选项的立本 |
itemText(i) | 获取索引为i的item的选项文本 |
currentIndex() | 返回选中项的索引 |
setItemText(int index,text) | 改变序号为index项的文本 |
QComboBox类中的常用信号如表所示。
信号 | 含义 |
---|---|
Activated | 当用户选中一个下拉选项时发射该信号 |
currentIndexChanged | 当下拉选项的索引发生改变时发射该信号 |
highlighted | 当选中一个己经选中的下拉选项时,发射该信号 |
让我们深入分析提供的示例代码,理解QComboBox的实际应用:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QComboBox
class ComboxDemo(QWidget):
def __init__(self, parent=None):
super(ComboxDemo, self).__init__(parent)
self.setWindowTitle("QComboBox 示例")
self.resize(300, 90)
# 创建布局和标签
layout = QVBoxLayout()
self.lbl = QLabel("")
# 创建并配置QComboBox
self.cb = QComboBox()
self.cb.addItem("C")
self.cb.addItem("C++")
self.cb.addItems(["Java", "C#", "Python"]) # 批量添加选项
# 连接信号与槽
self.cb.currentIndexChanged.connect(self.selectionchange)
# 将控件添加到布局
layout.addWidget(self.cb)
layout.addWidget(self.lbl)
self.setLayout(layout)
def selectionchange(self, i):
"""当下拉选项变化时执行的槽函数"""
self.lbl.setText(self.cb.currentText()) # 更新标签文本
self.lbl.adjustSize() # 调整标签大小以适应文本
# 打印调试信息
print("列表中的项目:")
for count in range(self.cb.count()):
print(f'项目{count} = {self.cb.itemText(count)}')
print(f"当前索引 {i}, 选择变为 {self.cb.currentText()}")
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = ComboxDemo()
demo.show()
sys.exit(app.exec_())
代码关键点分析:
初始化与布局:
self.cb.setEditable(True) # 启用编辑功能
self.cb.setInsertPolicy(QComboBox.InsertAtTop) # 设置新项的插入策略
可以为每个选项添加用户数据:
self.cb.addItem("Python", "py") # 显示文本为"Python",关联数据为"py"
self.cb.addItem("Java", "java")
# 获取当前选中项的数据
current_data = self.cb.currentData()
使用QSS定制外观:
self.cb.setStyleSheet("""
QComboBox {
border: 2px solid gray;
border-radius: 5px;
padding: 1px 18px 1px 3px;
min-width: 6em;
}
QComboBox::drop-down {
subcontrol-origin: padding;
subcontrol-position: top right;
width: 15px;
border-left-width: 1px;
border-left-color: darkgray;
border-left-style: solid;
}
""")
# 清空现有选项
self.cb.clear()
# 从文件或数据库加载新选项
new_items = ["Ruby", "Go", "Swift"]
self.cb.addItems(new_items)
# 设置默认选中项
self.cb.setCurrentIndex(1)
选项更新后保持原选择:
current_text = self.cb.currentText()
self.cb.clear()
self.cb.addItems(new_items)
index = self.cb.findText(current_text)
if index >= 0:
self.cb.setCurrentIndex(index)
self.cb.blockSignals(True)
# 执行大量添加/删除操作
self.cb.blockSignals(False)
下面是一个增强版的QComboBox示例,包含更多实用功能:
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout,
QLabel, QComboBox, QPushButton)
from PyQt5.QtGui import QIcon
class EnhancedComboBoxDemo(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle(" 增强版QComboBox示例")
self.setGeometry(300, 300, 350, 150)
layout = QVBoxLayout()
# 创建可编辑的QComboBox
self.cb = QComboBox(self)
self.cb.setEditable(True)
self.cb.addItems([" 苹果", "香蕉", "橙子", "葡萄"])
# 添加带图标的选项
self.cb.addItem(QIcon("icon.png"), "芒果")
# 添加关联数据
self.cb.addItem("Python", "编程语言")
self.cb.addItem("Java", "企业级语言")
# 连接多个信号
self.cb.currentIndexChanged.connect(self.on_index_changed)
self.cb.editTextChanged.connect(self.on_text_edited)
self.cb.highlighted.connect(self.on_highlighted)
# 添加功能按钮
self.btn_add = QPushButton("添加当前文本", self)
self.btn_add.clicked.connect(self.add_current_text)
self.btn_clear = QPushButton("清空选项", self)
self.btn_clear.clicked.connect(self.cb.clear)
self.lbl_status = QLabel("状态: 等待选择...", self)
# 添加控件到布局
layout.addWidget(self.cb)
layout.addWidget(self.btn_add)
layout.addWidget(self.btn_clear)
layout.addWidget(self.lbl_status)
self.setLayout(layout)
def on_index_changed(self, index):
text = self.cb.currentText()
data = self.cb.currentData()
self.lbl_status.setText(f" 选择了: {text} (数据: {data})")
def on_text_edited(self, text):
print(f"编辑文本: {text}")
def on_highlighted(self, index):
print(f"高亮选项: {self.cb.itemText(index)}")
def add_current_text(self):
text = self.cb.currentText()
if text and self.cb.findText(text) == -1: # 避免重复添加
self.cb.addItem(text)
self.lbl_status.setText(f" 已添加: {text}")
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = EnhancedComboBoxDemo()
ex.show()
sys.exit(app.exec_())
这个增强版示例展示了:
QComboBox是PyQt5中功能丰富且灵活的控件,通过本文的学习,您应该已经掌握了:
QComboBox的基本使用方法