我使用QSortFilterProxyModel过滤模型数据并将其显示在tableView中。 然后我想聚合过滤后的数据,所以我创建了一个新的tableView2来显示过滤后的数据聚合
我创建了一个新的QSortFilterProxy模型来聚合数据,但我不知道如何获取源数据,然后增加数据
但以我目前对QSortFilterProxy模型的了解,我似乎无法开始
import sys
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5.QtCore import Qt
class FilterProxyModel(QtCore.QSortFilterProxyModel):
def __init__(self, headers):
super(FilterProxyModel, self).__init__(parent=None)
self._headers = headers
def headerData(self, section, orientation, role):
if role == Qt.DisplayRole:
if orientation == Qt.Horizontal:
if self.columnCount() < section+1:
return QtCore.QVariant()
else:
return self._headers[section]
return super().headerData(section, orientation, role)
def data(self, index, role=None):
if role == Qt.DisplayRole:
if index.row() < 1:
return 1
else:
return QtCore.QVariant()
def rowCount(self, parent=None, *args, **kwargs):
return 1
def columnCount(self, parent=None, *args, **kwargs):
return len(self._headers)
class TableModel(QtCore.QAbstractTableModel):
def __init__(self, datas):
super(TableModel, self).__init__()
self._datas = datas
def data(self, index, role=Qt.DisplayRole):
if role == Qt.DisplayRole:
return self._datas[index.row()][index.column()]
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self._datas)
def columnCount(self, parent=QtCore.QModelIndex()):
if self._datas:
return len(self._datas[0])
else:
return 0
class MainWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(MainWidget, self).__init__(parent)
self.datas = [('a1', 'b1', 'c'), ('a2', 'b1', 'c'), ('a3', 'b1', 'c'), ('a4', 'b1', 'c')]*25
self.model = TableModel(self.datas)
self.proxy_model = QtCore.QSortFilterProxyModel()
self.proxy_model.setSourceModel(self.model)
self.proxy_model.setFilterRegExp(QtCore.QRegExp('a1|a3'))
self.proxy_model.setFilterKeyColumn(0)
self.proxy_model2 = FilterProxyModel(['a1', 'a3'])
self.proxy_model2.setSourceModel(self.model)
self.proxy_model2.setFilterRegExp(QtCore.QRegExp('a1|a3'))
self.proxy_model2.setFilterKeyColumn(0)
self.treeview = QtWidgets.QTableView()
self.treeview.setModel(self.proxy_model)
self.treeview2 = QtWidgets.QTableView()
self.treeview2.setModel(self.proxy_model2)
layout = QtWidgets.QVBoxLayout(self)
hlayout = QtWidgets.QHBoxLayout()
hlayout.addWidget(self.treeview)
hlayout.addWidget(self.treeview2)
layout.addLayout(hlayout)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
main = MainWidget()
main.show()
sys.exit(app.exec_())
这是我希望根据指定的头键(a1、a3)实现的效果,以执行数据聚合:
proxymodel用于映射项目,但在本例中,目标是计数,因此使用proxymodel对我来说似乎没有必要。相反,更容易使用
match()
来计数和连接指示模型中某些更改的信号以重新计算它相关问题 更多 >
编程相关推荐