【发布时间】:2023-01-23 05:27:20
【问题描述】:
我正在尝试将此 post 的第一个答案中的代码从 pyqt5 转换为 pyqt6,但到目前为止还没有成功。
我设法使用以下代码运行了一些东西:
#!/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)
# add a filter model to filter matching items
self.pFilterModel = QSortFilterProxyModel(self)
self.pFilterModel.setFilterCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive)
self.pFilterModel.setSourceModel(self.model())
# add a completer, which uses the filter model
self.completer = QCompleter(self.pFilterModel, self)
# always show all (filtered) completions
self.completer.setCompletionMode(QCompleter.CompletionMode.UnfilteredPopupCompletion)
self.setCompleter(self.completer)
# connect signals
self.lineEdit().textEdited.connect(self.pFilterModel.setFilterFixedString)
self.completer.activated.connect(self.on_completer_activated)
# on selection of an item from the completer, select the corresponding item from combobox
def on_completer_activated(self, text):
if text:
index = self.findText(text)
self.setCurrentIndex(index)
self.activated[str].emit(self.itemText(index))
# on model change, update the models of the filter and completer as well
def setModel(self, model):
super(ExtendedComboBox, self).setModel(model)
self.pFilterModel.setSourceModel(model)
self.completer.setModel(self.pFilterModel)
# on model column change, update the model column of the filter and completer as well
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()
# either fill the standard model of the combobox
combo.addItems(string_list)
# or use another model
#combo.setModel(QStringListModel(string_list))
combo.resize(300, 40)
combo.show()
sys.exit(app.exec())
但是,当我开始在ExtendedComboBox(例如字母h)中输入内容然后单击其中一个过滤条目(例如Hello word)时,我遇到了一个奇怪的错误我有以下错误:
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 中有类似的东西,我无法弄清楚
【问题讨论】:
-
我以前从未使用过 PyQt6,所以这就是为什么我把它写成评论而不是答案。在PySide2 (which is PyQt5)的这个页面上,
activated信号接受两种参数类型:整数和海峡.但是在PySide6 (PyQt6)文档中,activated信号现在只接受一种类型:整数.尝试将此行self.activated[str].emit(self.itemText(index))设置为self.activated[int].emit(index)。我希望它有效或给你一些见识。 -
信号过载在过去几年中已逐渐消除,您应该只在仍然实际需要时才继续使用它们。在任何情况下,只要有疑问,请检查官方 C++ API 文档:自 5.14 以来,
activated重载已在 Qt5 中宣布过时。如果您需要字符串信号版本,请使用textActivated()。 -
以上两个 cmets 都有效,谢谢!你给了我宝贵的见解和建议
标签: python-3.x pyqt5 pyqt6