QcomboBox下拉选项模糊搜索可以用以下两种方法实现:

1、基于已经初始化了一个基础的QComboBox,额外增加设置实现方法

# 手动输入
self.ui.comboBox.setEditable(True) 
# 添加筛选器模型来筛选匹配项
filterModel = QSortFilterProxyModel(self.ui.comboBox)
filterModel.setFilterCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive) # 大小不敏感
filterModel.setSourceModel(self.ui.comboBox.model())
# 添加一个使用筛选器模型的QCompleter
completer = QCompleter(filterModel,self)
# 始终显示所有(过滤后的)补全结果
completer.setCompletionMode(QCompleter.CompletionMode.UnfilteredPopupCompletion)
completer.setCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive) # 不区分大小写
self.ui.comboBox.setCompleter(completer)
# 绑定事件
self.ui.comboBox.editTextChanged.connect(filterModel.setFilterFixedString)

2、QComboBox作为父类,重新拓展一个类来实现

import sys
 
from PyQt5.QtCore import QSortFilterProxyModel, Qt
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QComboBox, QCompleter
 
 
# 扩展ComboBox类,增加Items模糊搜索功能
class ComboBox(QComboBox):
    def __init__(self, parent=None):
        super(ComboBox, self).__init__(parent)
 
        self.setFocusPolicy(Qt.StrongFocus)
        self.setEditable(True)
 
        # 添加一个过滤代理模型
        # 过滤代理模型的作用是,根据输入的字符串进行筛选,筛选出符合条件的Items
        self.SortFilterProxyModel = QSortFilterProxyModel(self)
        self.SortFilterProxyModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
        self.SortFilterProxyModel.setSourceModel(self.model())
 
        # 添加一个自动完成插件
        self.completer = QCompleter(self.SortFilterProxyModel, self)
        self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion)
        self.setCompleter(self.completer)
 
        # 链接对应信号槽
        self.lineEdit().textEdited.connect(self.SortFilterProxyModel.setFilterFixedString)
        self.completer.activated.connect(self.on_completer_activated)

    # 根据给定的文本在列表中查找并选中对应的项,并发出activated信号。
    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(ComboBox, self).setModel(model)
        self.SortFilterProxyModel.setSourceModel(model)
        self.completer.setModel(self.SortFilterProxyModel)
 
    # 设置下拉框的模型列。
    def setModelColumn(self, column):
        self.completer.setCompletionColumn(column)
        self.SortFilterProxyModel.setFilterKeyColumn(column)
        super(ComboBox, self).setModelColumn(column)
 
 
class QComboBoxDemo(QWidget):
    def __init__(self):
        super(QComboBoxDemo, self).__init__()
        self.initUI()
 
    def initUI(self):
        # 设置窗体的标题
        self.setWindowTitle("下拉列表模糊搜索功能")
        # 调整窗体大小
        self.resize(600, 400)
        # 使用垂直布局
        layout = QVBoxLayout()
        # 创建一个标签控件
        self.label = QLabel('请选对应选项')
        # 创建下拉列表控件
        self.ComboBoxTest = ComboBox()
        # 添加可选内容
        self.ComboBoxTest.addItem('device1')
        self.ComboBoxTest.addItem('device2')
        self.ComboBoxTest.addItem('device3')
        # 以列表形式添加内容
        self.ComboBoxTest.addItems(['设备1', '设备2', '设备3'])

        self.ComboBoxTest.currentIndexChanged.connect(self.selectionChange)
 
        layout.addWidget(self.label)
        layout.addWidget(self.ComboBoxTest)
 
        self.setLayout(layout)
 
    def selectionChange(self, i):
        self.label.setText(self.ComboBoxTest.currentText())
        self.label.adjustSize()
        
        # 打印下拉列表中的所有选项
        for count in range(self.ComboBoxTest.count()):
            print('选项' + str(count) + '=' + self.ComboBoxTest.itemText(count))

        # 打印当前索引
        print('当前索引', i, '选项被改变', self.ComboBoxTest.currentText())
 
 
if __name__ == '__main__':
    # 通过类创建一个应用
    app = QApplication(sys.argv)
    # 创建一个窗口
    w = QComboBoxDemo()
    # 让窗口显示
    w.show()
    sys.exit(app.exec_())

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部