Pyqt5 带搜索功能的Qcombobox

废话不多说,直接上效果图GIF,如下:

功能总结:


        (1)可以看到,该Qcombobox有编辑功能,在输入一些字符后,Qcombobox会弹出含有这些字符和列表,按回车后默认选择是下拉列表中的第一个。

        (2)同时,该搜索功能可以支持输入子项中非首字母的部分,然后弹出含有该字符的所有列表项,如列表有【jj,jk,kk,kl】,输入k,会弹出【jk,kk,kl】下拉列表。

        (3)搜索时,支持不区分字母大小写功能,这个在GIF没体现,有兴趣的可以改写Qcombobox原有的列表进行尝试。

原理:


        (1)利用Qcompleter的自动补全功能和QSortFilterProxyModel的过滤功能。首先将Qcombobox的列表内容填到筛选器模型QSortFilterProxyModel中去,并设置大小写不敏感Qt.CaseInsensitive,然后为Qcombobox设置补全器Qcompleter,并设置它对大小写不敏感Qt.CaseInsensitive和始终显示所有补全的结果展示效果QCompleter.UnfilteredPopupcomletion。

        (2)相应键盘按键事件,设置按下回车后是选中补全器展示列的首项,同时Qcombobox下拉框收起。

完整测试代码:

from PyQt5.QtWidgets import QWidget, QComboBox, QLineEdit, QApplication
from PyQt5.QtGui import QMouseEvent
from PyQt5.Qt import Qt, QRect, QCompleter, QSortFilterProxyModel
import sys
 
# 带搜索功能的下拉框
class ExtendedComboBox(QComboBox):
    def __init__(self, parent=None):
        super(ExtendedComboBox, self).__init__(parent)
        # self.setFocusPolicy(Qt.StrongFocus)
        self.setEditable(True)
 
        # 添加筛选器模型来筛选匹配项
        self.pFilterModel = QSortFilterProxyModel(self)
        self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive)  # 大小写不敏感
        self.pFilterModel.setSourceModel(self.model())
 
        # 添加一个使用筛选器模型的QCompleter
        self.completer = QCompleter(self.pFilterModel, self)
        # 始终显示所有(过滤后的)补全结果
        self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion)
        self.completer.setCaseSensitivity(Qt.CaseInsensitive)  # 不区分大小写
        self.setCompleter(self.completer)
 
        # Qcombobox编辑栏文本变化时对应的槽函数
        self.lineEdit().textEdited.connect(self.pFilterModel.setFilterFixedString)
        self.completer.activated.connect(self.on_completer_activated)
 
    # 当在Qcompleter列表选中候,下拉框项目列表选择相应的子项目
    def on_completer_activated(self, text):
        if text:
            index = self.findText(text)
            self.setCurrentIndex(index)
            # self.activated[str].emit(self.itemText(index))
 
    # 在模型更改时,更新过滤器和补全器的模型
    def setModel(self, model):
        super(ExtendedComboBox, self).setModel(model)
        self.pFilterModel.setSourceModel(model)
        self.completer.setModel(self.pFilterModel)
 
    # 在模型列更改时,更新过滤器和补全器的模型列
    def setModelColumn(self, column):
        self.completer.setCompletionColumn(column)
        self.pFilterModel.setFilterKeyColumn(column)
        super(ExtendedComboBox, self).setModelColumn(column)
 
    # 回应回车按钮事件
    def keyPressEvent(self, e):
        if e.key() == Qt.Key_Enter & e.key() == Qt.Key_Return:
            text = self.currentText()
            index = self.findText(text, Qt.MatchExactly | Qt.MatchCaseSensitive)
            self.setCurrentIndex(index)
            self.hidePopup()
            super(ExtendedComboBox, self).keyPressEvent(e)
        else:
            super(ExtendedComboBox, self).keyPressEvent(e)
 
def run():
    app = QApplication(sys.argv)
    win = ExtendedComboBox()
    l = ["", "1aew","2asd","3ewqr","3ewqc","2wqpu","1kjijhm", "4kjndw", "5ioijb","6eolv", "11ofmsw"]
    win.addItems(l)
    win.show()
    sys.exit(app.exec_())
 
 
if __name__ == '__main__':
    run()

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PyQt5是一个用于创建GUI应用程序的Python库。要创建搜索功能的下拉多选,可以使用QComboBox和QListWidget来实现。 首先,需要导入PyQt5库中的QComboBox和QListWidget类,以及其他必要的模块。 ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QComboBox, QLineEdit, QHBoxLayout, QListWidget, QListWidgetItem, QVBoxLayout, QWidget from PyQt5.QtCore import Qt ``` 接下来,创建一个派生自QMainWindow的自定义窗口类,并在其构造函数中添加一个QComboBox和一个QLineEdit,用于实现下拉多选搜索功能。同时,还需要为QComboBox的popup事件、文本编辑事件和查询文本值改变事件连接相应的槽函数。 ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() self.combo = QComboBox(self) self.search_box = QLineEdit(self) self.search_box.setPlaceholderText("搜索") self.combo.setEditable(True) self.combo.setLineEdit(self.search_box) self.combo.setInsertPolicy(QComboBox.InsertAtTop) self.combo.popup().installEventFilter(self) self.search_box.textEdited.connect(self.search_items) self.combo.currentIndexChanged.connect(self.handle_selection) def search_items(self, text): self.combo.clear() for item in all_items: if text.lower() in item.lower(): self.combo.addItem(item) def handle_selection(self, index): texts = [] for i in range(self.combo.count()): if self.combo.itemData(i, Qt.CheckStateRole) == Qt.Checked: texts.append(self.combo.itemText(i)) print(texts) def eventFilter(self, obj, event): if obj == self.combo.popup() and event.type() == QEvent.Show: self.search_box.clear() return super().eventFilter(obj, event) ``` 在自定义窗口类的构造函数中,我们根据文本编辑事件和查询文本值改变事件,实现了搜索功能。当用户输入搜索关键字时,会根据关键字筛选出匹配的选项,并将其添加到下拉多选中。同时,我们还在handle_selection函数中获取当前选中的所有选项,并打印出来。 最后,实例化自定义窗口类并运行应用程序。 ```python if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 通过以上步骤,就可以创建一个搜索功能的下拉多选。用户可以在搜索中输入关键字,系统会根据输入的关键字进行筛选,并将匹配的选项显示在下拉列表中,用户选中的选项会在选项变化时打印出来。 当然,以上只是一个简单的示例,你可以根据自己的实际需求对其进行扩展和修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值