Reputation: 150
I'll use some filtering criteria to hide some of the rows, I want the verticalHeader to redisplay the sequence number:
from PyQt5 import QtWidgets
from PyQt5 import QtGui
class MyQTableView(QtWidgets.QTableView):
def __init__(self, parent=None):
super(MyQTableView, self).__init__(parent)
self.model = QtGui.QStandardItemModel()
self.setModel(self.model)
self.init_data(['title'], [('a',), ('b',), ('c',)])
def init_data(self, headers, datas):
self.model.setHorizontalHeaderLabels(headers)
for row, rows in enumerate(datas):
for column, data in enumerate(rows):
item = QtGui.QStandardItem(f'{data}')
self.model.setItem(row, column, item)
if row == 1:
#To hide a row
self.setRowHidden(1, True)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
table = MyQTableView()
table.show()
sys.exit(app.exec_())
The actual QTableView is as follows:
title
1 a
3 c
The expected QTableView as:
title
1 a
2 c
Upvotes: 0
Views: 254
Reputation: 244162
In this case instead of hiding rows it is better to use a QSortFilterProxyModel where it overrides the headerData so that it does not depend on the sourceModel and implementing the custom filter.
class FilterProxyModel(QtCore.QSortFilterProxyModel):
def headerData(self, section, orientation, role):
if orientation == QtCore.Qt.Vertical and role == QtCore.Qt.DisplayRole:
return section + 1
return super().headerData(section, orientation, role)
def filterAcceptsRow(self, row, parent):
if row == 1:
return False
return True
class MyQTableView(QtWidgets.QTableView):
def __init__(self, parent=None):
super(MyQTableView, self).__init__(parent)
self.model = QtGui.QStandardItemModel()
self.proxy_model = FilterProxyModel()
self.proxy_model.setSourceModel(self.model)
self.setModel(self.proxy_model)
self.init_data(["title"], [("a",), ("b",), ("c",)])
def init_data(self, headers, datas):
self.model.setHorizontalHeaderLabels(headers)
for row, rows in enumerate(datas):
for column, data in enumerate(rows):
item = QtGui.QStandardItem(f"{data}")
self.model.setItem(row, column, item)
Upvotes: 2