使用搜索栏查找列表中的项目



我想使用行编辑作为搜索栏,以便在Qlistwidget中查找项目。我还希望 qlistwidget 在行编辑中更改文本时向上/向下滚动(在搜索中(。

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QGridLayout, QWidget, QListWidget, QLineEdit

class Window(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
centralWidget = QWidget()
self.setCentralWidget(centralWidget)
self.ListBox = QListWidget()
self.ListBox.insertItem(0,'Temperature')
self.ListBox.insertItem(1,'Mass')
self.ListBox.insertItem(2,'Length')
self.ListBox.insertItem(3,'Height')
self.ListBox.insertItem(4,'Width')
self.ListBox.insertItem(5,'Volume')
self.ListBox.insertItem(6,'Surface_Area')
self.ListBox.insertItem(7,'Material')
self.ListBox.insertItem(8,'Location')
self.ListBox.insertItem(9,'Strength')
self.ListBox.insertItem(10,'Color')
self.Search_Bar = QLineEdit()
layout = QGridLayout(centralWidget)
layout.addWidget(self.ListBox)
layout.addWidget(self.Search_Bar)
self.Search_Bar.textChanged.connect(self.Search)

def Search(self):
if self.Search_Bar.text() == 'Strength':
pass

if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())

所有Qt项模型提供的内部实现的match函数通常比通过Python循环列表更快。

def Search(self, text):
model = self.ListBox.model()
match = model.match(
model.index(0, self.ListBox.modelColumn()), 
QtCore.Qt.DisplayRole, 
text, 
hits=1, 
flags=QtCore.Qt.MatchStartsWith)
if match:
self.ListBox.setCurrentIndex(match[0])

这将自动选择并滚动到找到的第一个项目(如果有(。