【发布时间】:2021-11-13 11:22:58
【问题描述】:
如何在 QTableView 中应用过滤器后显示隐藏行。我附上了下面的代码,并为过滤器值“2”的第二列应用了过滤器。它按要求工作。如果想在第二列中显示包含值“3”的隐藏行。它没有显示该行。我使用 match 命令来查找行。一切正常。但行没有显示。请帮我解决这个问题。
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class TableModel(QAbstractTableModel):
def __init__(self, data):super().__init__();self._data = data
def data(self, index, role):
if role == Qt.ItemDataRole.DisplayRole or role == Qt.EditRole :return self._data[index.row()][index.column()]
def rowCount(self, index):return len(self._data)
def columnCount(self, index):return len(self._data[0])
class tableview(QTableView):
def __init__(self):
super().__init__()
self.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection)
self.setFocusPolicy(Qt.FocusPolicy.NoFocus)
self.horizontalHeader().setStyleSheet("::section{Background-color:lightgray;border-radius:10px;}")
self.smodel = QSortFilterProxyModel()
self.smodel.setFilterKeyColumn(1)
self.setModel(self.smodel)
self.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
self.smodel.setSourceModel(TableModel([[1,2],[1,2],[1,3],[1,4]]))
self.smodel.setFilterFixedString('2')
def find(self,key):
start = self.smodel.index(0, 1)
matches = self.smodel.sourceModel().match(start,Qt.DisplayRole,key,hits=-1,flags=Qt.MatchExactly)
for match in matches:self.showRow(match.row())
app = QApplication([])
table=tableview()
table.show()
b=QPushButton();b.clicked.connect(lambda:table.find('3'))
b.show()
app.exec_()
当前结果
按钮按下所需的结果
【问题讨论】:
-
请不要将代码放在
:之后的一行中 - 它不可读。与;相同。将代码放在下一行。查看更多PEP 8 -- Style Guide for Python Code -
如果你想只显示最后一行然后只使用
smodel.setFilterFixedString(key)如果你想显示所有行然后清除过滤器-smodel.setFilterFixedString("")如果你想要带有2或3的行然后self.smodel.setFilterRegExp("2|3") -
filter和showRow()/hideRow()可以以不同的方式工作 - 所以他们可能无法一起工作。过滤器在发送到TableView之前删除数据,showRow()/hideRow()删除TableView中的行。如果您想使用showRow,那么您可能需要清除过滤器、隐藏所有行并显示带有2和3的行 -
@furas 谢谢。是否可以像您所说的那样获取当前的过滤器表达式并将新的过滤器附加为组合过滤器?例如:
x=getcurrentfilterexp(); self.smodel.setFilterRegExp(x+"|3") -
最好将值保留在列表
self.filtered并使用"|".join(self.filtered)- 这样您就可以简单地从列表中添加或删除。请参阅我的答案中的示例。
标签: python pyqt5 qtableview