【发布时间】:2021-08-25 17:00:33
【问题描述】:
如何按以下顺序排列过滤后的QListwidget项,
- 列表项以搜索词开始。
- 列表项包含在搜索词的任意位置,最后。
- 列表项结束在搜索项中。
例如,在我的程序中,我的搜索词是“I”,我想安排以“I”开头的项目(“India”、“Iceland”、“Iran” ),然后是包含任何地方的项目("America", "China", "Fiji","Russia"),最后项目以搜索词"I" (“文莱”、“马里”)
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QListWidget,QLineEdit,QVBoxLayout
from PyQt5.QtCore import Qt,QEvent
items = ["America","canada","Mali","India","Russia", "Fiji","Nepal","Iran","China","Japan","IceLand","Brunei"]
class Listwidget(QWidget):
def __init__(self):
super(). __init__()
self.setWindowTitle("List Box Samples")
self.le = QLineEdit()
self.le.textChanged.connect(self.func_textchanged)
self.lb_master = QListWidget()
self.lb_search = QListWidget()
vbox = QVBoxLayout(self)
vbox.addWidget(self.le)
vbox.addWidget(self.lb_search)
self.lb_master.addItems(items)
self.lb_search.addItems(items)
self.le.setFocus()
self.le.installEventFilter(self)
def eventFilter(self, source,event):
if event.type() == QEvent.KeyPress and source is self.le:
if event.key() == Qt.Key_Backspace:
if len(self.le.text()) == 0:
self.fun_normal()
return super(Listwidget,self).eventFilter(source,event)
def fun_normal(self):
self.lb_search.clear()
if normal_count > 0:
for item in item_normal:
self.lb_search.addItem(item.text())
def func_search(self):
self.lb_search.clear()
if search_count > 0:
for item in item_anywhere:
self.lb_search.addItem(item.text())
def func_textchanged(self):
global item_normal,item_anywhere,search_count,normal_count
item_normal = self.lb_master.findItems("*",Qt.MatchWildcard)
item_anywhere = self.lb_master.findItems(self.le.text(), Qt.MatchContains)
normal_count = len(item_normal)
search_count = len(item_anywhere)
self.func_search()
if __name__ == "__main__":
app = QApplication(sys.argv)
win = Listwidget()
win.show()
sys.exit(app.exec_())
【问题讨论】:
-
无关,但很重要:不要使用全局变量,使用实例属性。此外,每个逗号后都应该有一个空格。
-
为什么大多数专业人士,对使用全局变量犹豫不决?任何系列。@musicamante
-
这不是犹豫,而是知识、经验和意识。使用全局变量可能会导致各种问题,包括难以跟踪的意外行为和错误(甚至崩溃)。大多数情况下,它们的使用不当(例如在您的情况下,您应该使用实例属性:
self.item_normal等),而有经验的程序员只有在他们真正知道他们'正在做,他们非常清楚如何使用它们以及为什么他们需要它们。我建议你做一些研究,从this post开始。