Python PyQt5下拉多选框实现示例

半杯拿铁
半杯拿铁
发布时间:2026-10-11 | 1人浏览过
原创

本文详细介绍如何在PyQt5中实现支持多选的动态下拉菜单。通过组合QComboBox与QListWidget视图,并在列表中嵌入QCheckBox控件,即可快速构建具备选中状态管理与事件响应的自定义下拉组件,附完整源代码与UI演示。

QComboBox基础使用

QComboBox是PyQt5中常用的下拉列表控件,它将按钮和可点击的下拉选项结合在一起,适用于单项选择场景。它提供了丰富的接口用于增删改查项:

  • addItem() / addItems():添加单个或批量下拉选项
  • clear():清空所有选项
  • count():返回选项总数
  • currentText() / currentIndex():获取当前选中文本及索引
  • itemText(i):获取指定索引项的文本

常用信号包括 activated(用户确认选中时触发)和 currentIndexChanged()(索引变更时触发)。

第一步:初始化基本下拉框

首先创建一个继承自QWidget的主窗口类,布局使用QVBoxLayout垂直排列控件。初始化时实例化QComboBox,绑定 currentIndexChanged 信号以便实时捕获用户交互。

PyQt5 QComboBox下拉菜单基础运行界面
运行后可见标准单选下拉列表与下方文本显示区域
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class ComboxDemo(QWidget):
    def __init__(self, parent=None):
        super(ComboxDemo, self).__init__(parent)
        self.setWindowTitle("combox 例子")
        self.resize(300, 90)
        layout = QVBoxLayout()
        self.lbl = QLabel("")

        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("Items in the list are :")
        for count in range(self.cb.count()):
            print('item' + str(count) + '=' + self.cb.itemText(count))
            print("Current index", i, "selection changed ", self.cb.currentText())

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

实现下拉多选功能

QComboBox原生不支持多选。要实现类似网页端Select的多选下拉效果,核心思路是将QComboBox的视图替换为带有复选框(QCheckBox)的列表控件(QListWidget)。当用户在下拉列表中勾选项目后,可通过回调收集所有被选中的项。

第二步:配置多选视图与模型

在 ComboCheckBox 类的构造函数中,定义选项名称列表。遍历该列表创建对应的 QCheckBox 实例,并将其添加到自定义的 QListWidget 中。随后将 QListWidget 的模型和视图分别赋予 QComboBox,从而接管下拉面板的渲染。

PyQt5下拉多选框展开后的复选框列表界面
展开下拉框后显示可独立勾选的复选框列表
from PyQt5.QtWidgets import QComboBox, QListWidgetItem, QListWidget, QCheckBox, \
  QApplication, QVBoxLayout, QWidget,QPushButton,QHBoxLayout,QLineEdit
import sys

class ComboCheckBox(QWidget):
  def __init__(self, parent=None):
        super(ComboCheckBox, self).__init__(parent)

        self.items = ['语文', '数学', '英语', '体育']
        self.box_list = []
        self.comb = QComboBox(self) #列表框QComboBox
        self.listwidget = QListWidget(self) #(列表控件)

        for i in range(len(self.items)):
            self.box_list.append(QCheckBox(self))
            self.box_list[i].setText(self.items[i])
            item = QListWidgetItem(self.listwidget)
            self.listwidget.setItemWidget(item, self.box_list[i])
            # QComboBox添加模型和视图,QListWidget设置为QComboBox的View,QListWidget的Model设置为QComboBox的Model
        self.comb.setModel(self.listwidget.model())
        self.comb.setView(self.listwidget)

        self.btn = QPushButton('选择', self)
        self.btn.clicked.connect(self.get_selected)
        self.line=QLineEdit()
        #布局
        layout = QVBoxLayout()
        layout.addWidget(self.btn)
        layout.addWidget(self.comb)
        layout.addWidget(self.line)
        self.setLayout(layout)

  def get_selected(self):
      ret = []
      for i in range(len(self.items)):
          if self.box_list[i].isChecked():
              ret.append(self.box_list[i].text())
      self.line.setText(str(ret))


if __name__ == "__main__":
  app = QApplication(sys.argv)
  ui = ComboCheckBox()
  ui.show()
  sys.exit(app.exec_())

第三步:监听并提取选中结果

用户完成勾选后,触发按钮的点击事件进入 get_selected 方法。该方法遍历之前保存的 box_list,利用 isChecked() 判断每个复选框的状态。将状态为 True 的复选框文本追加至列表,并最终通过 QLineEdit 显示在界面上。

PyQt5下拉多选框点击选择按钮后的结果展示界面
点击按钮后,选中的科目以字符串形式显示在输入框内

上述逻辑确保了多选数据的准确捕获与反馈。开发时需注意,此方案依赖于将自定义部件作为子项插入列表,因此必须妥善管理生命周期以避免内存泄漏。

以上就是Python PyQt5下拉多选框的实现详细内容,更多关于PyQt5 GUI界面开发技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表