gpt4 book ai didi

python - 使用 QSortFilterProxyModel 自定义 QCompleter

转载 作者:太空宇宙 更新时间:2023-11-03 20:39:54 24 4
gpt4 key购买 nike

我想为 QLineEditQCompleter 启用通配符匹配。如果字符串模型是 ['abc', 'cba'],当我输入 ab*a* 时,它应该显示 abc。下面是我编写的代码,但它的行为仍然像常规匹配一样。知道我应该如何解决它吗?

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys, random


class MyCompleter(QCompleter):
def __init__(self, *args):
super().__init__(*args)

def setModel(self, model):
self.proxyModel = QSortFilterProxyModel()
self.proxyModel.setSourceModel(model)
super().setModel(self.proxyModel)

def updatePattern(self, patternStr):
self.proxyModel.setFilterWildcard(patternStr)


class MyMain(QMainWindow):
def __init__(self, *args):
super().__init__(*args)
self.initUI()

def initUI(self):
model = QStringListModel(['abc', 'cba'])

completer = MyCompleter()
completer.setModel(model)

searchBar = QLineEdit(self)
searchBar.setCompleter(completer)
searchBar.textChanged.connect(lambda wildcard: completer.updatePattern(wildcard))

vLayout = QVBoxLayout()
vLayout.addWidget(searchBar, alignment=Qt.AlignCenter)

self.setCentralWidget(QWidget())
self.centralWidget().setLayout(vLayout)


if __name__ == '__main__':
app = QApplication(sys.argv)
mm = MyMain()
mm.show()
sys.exit(app.exec_())

最佳答案

尝试一下:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *


class LineEdit(QLineEdit): # +++
def __init__(self, *args, **kwargs):
QLineEdit.__init__(self, *args, **kwargs)
self.multipleCompleter = None

def keyPressEvent(self, event):
QLineEdit.keyPressEvent(self, event)
if not self.multipleCompleter:
return
c = self.multipleCompleter

if self.text() == "":
return
c.setCompletionPrefix(self.cursorWord(self.text()))

if len(c.completionPrefix()) < 1:
c.popup().hide()
return
c.complete()

def cursorWord(self, sentence):
p = sentence.rfind(" ")
if p == -1:
return sentence
return sentence[p + 1:]

def insertCompletion(self, text):
p = self.text().rfind(" ")
if p == -1:
self.setText(text)
else:
self.setText(self.text()[:p+1]+ text)

def setMultipleCompleter(self, completer):
self.multipleCompleter = completer
self.multipleCompleter.setWidget(self)
completer.activated.connect(self.insertCompletion)


class MyCompleter(QCompleter):
def __init__(self, *args):
super().__init__(*args)

def setModel(self, model):
self.proxyModel = QSortFilterProxyModel()
self.proxyModel.setSourceModel(model)
super().setModel(self.proxyModel)

def updatePattern(self, patternStr):
print(f"patternStr-> {patternStr}")
self.proxyModel.setFilterWildcard(patternStr)


class MyMain(QMainWindow):
def __init__(self, *args):
super().__init__(*args)
self.initUI()

def initUI(self):
model = QStringListModel(['abc', 'cba'])

completer = MyCompleter()
completer.setModel(model)

# searchBar = QLineEdit(self)
# searchBar.setCompleter(completer)
# searchBar.textChanged.connect(lambda wildcard: completer.updatePattern(wildcard))

searchBar = LineEdit(self) # +++
completer.setCaseSensitivity(Qt.CaseInsensitive) # +++
searchBar.setMultipleCompleter(completer) # +++

vLayout = QVBoxLayout()
vLayout.addWidget(searchBar, alignment=Qt.AlignCenter)
self.setCentralWidget(QWidget())
self.centralWidget().setLayout(vLayout)


if __name__ == '__main__':
app = QApplication(sys.argv)
mm = MyMain()
mm.show()
sys.exit(app.exec_())

enter image description here

关于python - 使用 QSortFilterProxyModel 自定义 QCompleter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56925246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com