from PyQt5.QtCore import Qt, pyqtSignal from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QCheckBox, QLabel, QPushButton, QHBoxLayout, QListWidget, QListWidgetItem, QAbstractItemView, QComboBox class CheckableComboBox(QComboBox): def __init__(self, *args, **kwargs): super(CheckableComboBox, self).__init__(*args, **kwargs) # Create a list widget to hold the items with checkboxes. self.list_widget = QListWidget(self) self.setModel(self.list_widget.model()) self.setView(self.list_widget) # Set selection mode and item flags so that each row can be checked individually. self.view().setSelectionMode(QAbstractItemView.MultiSelection) self.view().setEditTriggers(QAbstractItemView.NoEditTriggers) # Connect signals for updating when an item is toggled. self.view().pressed.connect(self.handle_item_pressed) def handle_item_pressed(self, index): """Handle checkbox toggle.""" item = self.list_widget.item(index.row()) if not hasattr(item, 'checked'): setattr(item, 'checked', False) item.checked = not item.checked text = item.text() state = "Checked" if item.checked else "Unchecked" print(f"{text} {state}") def addItem(self, text): """Override add method to include check box functionality.""" item = QListWidgetItem(text, self.list_widget) item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) item.setCheckState(Qt.Unchecked) if __name__ == "__main__": app = QApplication([]) window = QWidget() layout = QVBoxLayout() combo_box = CheckableComboBox(window) combo_box.addItem("Option 1") combo_box.addItem("Option 2") combo_box.addItem("Option 3") layout.addWidget(combo_box) window.setLayout(layout) window.show() app.exec_() 这段代码中如何获取下拉复选框中所选择的选项?
时间: 2025-06-25 12:23:20 浏览: 9
### 如何从 PyQt5 的 CheckableComboBox 中获取所有被勾选的项
在 PyQt5 中实现一个多选下拉框(Checkable ComboBox),可以通过重写 `QComboBox` 并设置其模型支持多选功能来完成。为了获取所有被勾选的项,可以遍历组合框中的每一项并检查它们的状态。
以下是具体方法:
#### 实现思路
通过创建一个继承自 `QComboBox` 的类,并利用 Qt 的信号槽机制以及数据模型的功能,可以在用户交互时动态更新所选项目列表[^1]。
下面是一个完整的代码示例展示如何实现这一目标:
```python
from PyQt5.QtWidgets import QApplication, QComboBox, QWidget, QVBoxLayout, QLabel
from PyQt5.QtCore import Qt
class CheckableComboBox(QComboBox):
def __init__(self, parent=None):
super().__init__(parent)
self.view().pressed.connect(self.handle_item_pressed)
def handle_item_pressed(self, index):
item = self.model().itemFromIndex(index)
if item.checkState() == Qt.Checked:
item.setCheckState(Qt.Unchecked)
else:
item.setCheckState(Qt.Checked)
def checked_items(self):
checked_list = []
for i in range(self.count()):
item = self.model().item(i)
if item.checkState() == Qt.Checked:
checked_list.append(item.text())
return checked_list
if __name__ == "__main__":
app = QApplication([])
window = QWidget()
layout = QVBoxLayout()
combo_box = CheckableComboBox()
items = ["Item 1", "Item 2", "Item 3", "Item 4"]
from PyQt5.QtGui import QStandardItemModel, QStandardItem
model = QStandardItemModel()
for item_text in items:
item = QStandardItem(item_text)
item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
item.setData(Qt.Unchecked, Qt.CheckStateRole)
model.appendRow(item)
combo_box.setModel(model)
layout.addWidget(combo_box)
label = QLabel("Selected Items:")
layout.addWidget(label)
def update_label():
selected_items = ", ".join(combo_box.checked_items()) or "<None>"
label.setText(f"Selected Items: {selected_items}")
combo_box.view().pressed.connect(update_label)
window.setLayout(layout)
window.show()
app.exec_()
```
上述代码展示了如何构建一个允许多选的 `QComboBox` 组件,并提供了一个函数用于返回当前已被勾选的所有条目名称[^2]。
#### 解释
- **CheckableComboBox 类**: 它扩展了标准的 `QComboBox` 功能,使其能够响应用户的点击事件并将该项标记为已选或未选状态。
- **checked_items 方法**: 此方法会迭代整个组合框内的所有条目,收集那些处于 “Checked” 状态下的条目的文本内容。
当运行此脚本时,它将显示一个窗口,其中包含一个多选组合框和标签。每当您更改组合框的选择时,该标签都会实时反映您的选择结果。
阅读全文
相关推荐


















