功能:
1.实现模糊查找子项
2.忽略大小写
3.查找到子项则显示他的所有上级
效果图:
代码:
from PyQt5 import QtWidgets, QtGui, QtCore
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.lineEdit = QtWidgets.QLineEdit()
self.treeWidget = QtWidgets.QTreeWidget()
self.setCentralWidget(self.treeWidget)
self.toolbar = self.addToolBar("Search")
self.toolbar.addWidget(self.lineEdit)
self.treeWidget.setHeaderLabels(["Name", "Age"])
for i in range(5):
item = QtWidgets.QTreeWidgetItem(["Item {}".format(i), str(i)])
self.treeWidget.addTopLevelItem(item)
for j in range(3):
child_item = QtWidgets.QTreeWidgetItem(["Child item {}".format(j), str(j)])
item.addChild(child_item)
self.lineEdit.textChanged.connect(self.search)
def search(self):
text = self.lineEdit.text().lower()
if not text:
# 如果搜索框为空,则显示所有项
items = self.treeWidget.findItems("", QtCore.Qt.MatchContains | QtCore.Qt.MatchRecursive, 0)
for item in items:
item.setHidden(False)
else:
# 否则按照搜索框内容进行模糊查找
items = self.treeWidget.findItems("", QtCore.Qt.MatchContains | QtCore.Qt.MatchRecursive, 0)
for item in items:
if text and text in item.text(0).lower():
self.showItemWithParents(item)
else:
self.hideItemWithChildren(item)
def showItemWithParents(self, item):
while item is not None:
item.setHidden(False)
item = item.parent()
def hideItemWithChildren(self, item):
item.setHidden(True)
for i in range(item.childCount()):
child_item = item.child(i)
self.hideItemWithChildren(child_item)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())