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_())
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » PyQt5 QcomboBox 下拉选项模糊搜索
发表评论 取消回复