PyQt6重载信号异常:ExtendedComboBox点击过滤项触发KeyError
PyQt6可过滤QComboBox信号适配修复
问题场景
将PyQt5的可过滤QComboBox代码迁移至PyQt6后,运行时在输入字符过滤条目并点击选中时触发以下错误:
python test.py Traceback (most recent call last): File "test.py", line 38, in on_completer_activated self.activated[str].emit(self.itemText(index)) KeyError: 'there is no matching overloaded signal' Aborted (core dumped)
错误原因
PyQt6对QComboBox的重载信号做了拆分:原PyQt5中activated信号包含int(索引)和str(文本)两个重载版本,可通过activated[str]指定文本版本;而PyQt6中将这两个版本拆分为独立的信号:
activated(int):传递选中条目的索引textActivated(str):传递选中条目的文本
因此原代码中activated[str]的写法在PyQt6中不再生效,导致KeyError。
修复后的代码
修改on_completer_activated方法中的信号发射语句,替换为PyQt6对应的textActivated信号:
#!/usr/bin/env python # -*- coding: utf-8 -*- from PyQt6.QtWidgets import QApplication from PyQt6.QtCore import QStringListModel from PyQt6 import QtCore, QtGui, QtWidgets from PyQt6.QtCore import Qt, QSortFilterProxyModel from PyQt6.QtWidgets import QCompleter, QComboBox import sys class ExtendedComboBox(QComboBox): def __init__(self, parent=None): super(ExtendedComboBox, self).__init__(parent) self.setFocusPolicy(Qt.FocusPolicy.StrongFocus) self.setEditable(True) # 添加过滤模型用于匹配条目 self.pFilterModel = QSortFilterProxyModel(self) self.pFilterModel.setFilterCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive) self.pFilterModel.setSourceModel(self.model()) # 添加自动补全组件,关联过滤模型 self.completer = QCompleter(self.pFilterModel, self) # 设置补全模式为显示所有过滤后的条目 self.completer.setCompletionMode(QCompleter.CompletionMode.UnfilteredPopupCompletion) self.setCompleter(self.completer) # 连接信号 self.lineEdit().textEdited.connect(self.pFilterModel.setFilterFixedString) self.completer.activated.connect(self.on_completer_activated) # 选中补全条目时,同步选中下拉框对应条目 def on_completer_activated(self, text): if text: index = self.findText(text) self.setCurrentIndex(index) # 替换为PyQt6的textActivated信号 self.textActivated.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) if __name__ == "__main__": app = QApplication(sys.argv) string_list = ['hola muchachos', 'adios amigos', 'hello world', 'good bye'] combo = ExtendedComboBox() # 方式一:填充下拉框的标准模型 combo.addItems(string_list) # 方式二:使用自定义模型 #combo.setModel(QStringListModel(string_list)) combo.resize(300, 40) combo.show() sys.exit(app.exec())
验证说明
修复后,输入字符过滤条目并点击选中时,将正确发射textActivated信号,不会再触发KeyError,功能与原PyQt5版本一致。
内容的提问来源于stack exchange,提问作者Woland
相关产品推荐
相关产品推荐

