You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:51:03