想用 pyqt或pyside实现 数据表格的表头筛选功能 类似于这样
但是遇到两个问题
- 无法做到自适应及多列筛选功能
- 无法获取行点击切换时触发的信号类似于单元格点击时cellPressed,点击行触发的事件函数是哪个?(应该有方法 哭)
代码前提,因为使用的是数据模型所以使用的是tableview方法添加控件 ,未使用TableWidget方法(如果能够实现预期请赐教)
import sys
from PySide2.QtCore import (QCoreApplication, QMetaObject, QRect, QSortFilterProxyModel)
from PySide2.QtGui import QStandardItemModel, QStandardItem
from PySide2.QtWidgets import *
class TableView(QWidget):
def __init__(self, arg=None):
super(TableView, self).__init__(arg)
self.setWindowTitle('qtbaleciew 表头筛选显示')
self.resize(500, 300)
self.model = QStandardItemModel(4, 3)
self.model.setHorizontalHeaderLabels(['id', 'name', '年龄'])
self.tableview = QTableView()
# 添加筛选模型
self.filter_proxy_model = QSortFilterProxyModel()
self.filter_proxy_model.setSourceModel(self.model)
# 对所有列进行筛选
self.filter_proxy_model.setFilterKeyColumn(-1)
self.tableview.setModel(self.filter_proxy_model)
# 设置表头
headview = self.tableview.horizontalHeader()
self.line_edit_01 = QLineEdit(headview)
headview.setMinimumHeight(60)
# ...
headview.setIndexWidget(self.model.index(1, 0), self.line_edit_01)
self.line_edit_01.resize(80, 20)
# todo 这里怎么弄大哥们
self.line_edit_01.move(10, 40)
# todo 当数据改变时触发筛选机制
# self.line_edit_01.textChanged.connect(self.filtertable)
item11 = QStandardItem('10')
item12 = QStandardItem('li')
item13 = QStandardItem('18')
self.model.setItem(0, 0, item11)
self.model.setItem(0, 1, item12)
self.model.setItem(0, 2, item13)
item21 = QStandardItem('10')
item22 = QStandardItem('xin')
item23 = QStandardItem('19')
layout = QVBoxLayout()
layout.addWidget(self.tableview)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication()
w =TableView()
w.show()
sys.exit(app.exec_())
运行结果及报错内容
ps 以为我写死了所以不能动态自适应,但这地方怎么弄,请赐教
我的解答思路和尝试过的方法
我想先实现自适应然后再去做筛选框内容触发的筛选事件。单个窗口的筛选我已经能做了,但是多个列都要添加筛选框还没有思路
self.filter_proxy_model还有.setFilterRole()这个方法应该有点啥用?
我想要达到的结果
这个图片是来自QT编写的 开源 数据库可视化工具上的原图, https://sqlitebrowser.org/ 可以参考(github上有 https://github.com/sqlitebrowser/sqlitebrowser
希望能用python解释