python GUI 按键值自动完成
python GUI autocomplete by key value
我正在尝试在 python 中创建一个自动完成 GUI,这样当我输入名字时,我会看到可能的姓氏。例如,假设我有这本字典:{"George": ["Washington", "Bush"]}
。当我开始输入 "G" 时,我希望它显示 "Washington" 和 "Bush"。选择 "Washington" 时,我希望显示 "Washington"。我是 GUI 的新手,我认为 PyQt 有一个自动完成的例子,但单词不是键值对而是单词列表。
https://wiki.python.org/moin/PyQt/Adding%20auto-completion%20to%20a%20QLineEdit
有没有办法编辑 link 中的代码,以便启用此功能?谢谢!
您必须重写 pathFromIndex 方法,这样当您 select 一些文本时,适当的选项就会写入 QLineEdit,并且要更改弹出窗口中显示的内容,应该使用委托。
from PyQt5 import QtCore, QtGui, QtWidgets
def create_model(d):
model = QtGui.QStandardItemModel()
for key, value in d.items():
for val in value:
it = QtGui.QStandardItem(key)
it.setData(val, QtCore.Qt.UserRole)
model.appendRow(it)
return model
class StyledItemDelegate(QtWidgets.QStyledItemDelegate):
def initStyleOption(self, option, index):
super(StyledItemDelegate, self).initStyleOption(option, index)
option.text = index.data(QtCore.Qt.UserRole)
class Completer(QtWidgets.QCompleter):
def __init__(self, parent=None):
super(Completer, self).__init__(parent)
QtCore.QTimer.singleShot(0, self.change_delegate)
@QtCore.pyqtSlot()
def change_delegate(self):
delegate = StyledItemDelegate(self)
self.popup().setItemDelegate(delegate)
def pathFromIndex(self, index):
return index.data(QtCore.Qt.UserRole)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
d = {
"George": ["Washington", "Bush"],
"Languages": ["Python", "C++"]
}
model = create_model(d)
w = QtWidgets.QLineEdit()
completer = Completer(w)
completer.setModel(model)
w.setCompleter(completer)
w.show()
sys.exit(app.exec_())
我正在尝试在 python 中创建一个自动完成 GUI,这样当我输入名字时,我会看到可能的姓氏。例如,假设我有这本字典:{"George": ["Washington", "Bush"]}
。当我开始输入 "G" 时,我希望它显示 "Washington" 和 "Bush"。选择 "Washington" 时,我希望显示 "Washington"。我是 GUI 的新手,我认为 PyQt 有一个自动完成的例子,但单词不是键值对而是单词列表。
https://wiki.python.org/moin/PyQt/Adding%20auto-completion%20to%20a%20QLineEdit
有没有办法编辑 link 中的代码,以便启用此功能?谢谢!
您必须重写 pathFromIndex 方法,这样当您 select 一些文本时,适当的选项就会写入 QLineEdit,并且要更改弹出窗口中显示的内容,应该使用委托。
from PyQt5 import QtCore, QtGui, QtWidgets
def create_model(d):
model = QtGui.QStandardItemModel()
for key, value in d.items():
for val in value:
it = QtGui.QStandardItem(key)
it.setData(val, QtCore.Qt.UserRole)
model.appendRow(it)
return model
class StyledItemDelegate(QtWidgets.QStyledItemDelegate):
def initStyleOption(self, option, index):
super(StyledItemDelegate, self).initStyleOption(option, index)
option.text = index.data(QtCore.Qt.UserRole)
class Completer(QtWidgets.QCompleter):
def __init__(self, parent=None):
super(Completer, self).__init__(parent)
QtCore.QTimer.singleShot(0, self.change_delegate)
@QtCore.pyqtSlot()
def change_delegate(self):
delegate = StyledItemDelegate(self)
self.popup().setItemDelegate(delegate)
def pathFromIndex(self, index):
return index.data(QtCore.Qt.UserRole)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
d = {
"George": ["Washington", "Bush"],
"Languages": ["Python", "C++"]
}
model = create_model(d)
w = QtWidgets.QLineEdit()
completer = Completer(w)
completer.setModel(model)
w.setCompleter(completer)
w.show()
sys.exit(app.exec_())