python qt 实现数据表 表头筛选

想用 pyqt或pyside实现 数据表格的表头筛选功能 类似于这样

img


但是遇到两个问题

  1. 无法做到自适应及多列筛选功能
  2. 无法获取点击切换时触发的信号类似于单元格点击时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_())


运行结果及报错内容

img


ps 以为我写死了所以不能动态自适应,但这地方怎么弄,请赐教

img

我的解答思路和尝试过的方法

我想先实现自适应然后再去做筛选框内容触发的筛选事件。单个窗口的筛选我已经能做了,但是多个列都要添加筛选框还没有思路
self.filter_proxy_model还有.setFilterRole()这个方法应该有点啥用?

我想要达到的结果

img


这个图片是来自QT编写的 开源 数据库可视化工具上的原图, https://sqlitebrowser.org/ 可以参考(github上有 https://github.com/sqlitebrowser/sqlitebrowser
希望能用python解释

点击行与列的方法,我记得有个modelindex?至少我用model写表格用的这个。
或者我记得tableview有个函数是判断点击返回索引的
没有的话,试试写个单机事件然后判断索引

还有tableview的自适应是手动写成的,自带的自适应产生的表格比例很烂,要自己计算一下大概的间隔(可能是我学的少)

多行筛选这个我会,你在调用数据的select语句中添加几个判断(就是where ? = ? and ? = ?)
如图中,就是select * from 表格 where id = '%1' and name = '%2' and 年龄 = ‘%3’,三个位置在每次select的时候获取对应列上的筛选文本,据可以多条限制。
其他问题就是再次基础上添加判断。

希望对你有帮助

设计的时候好像可以锚定另一个组件的吧。如果不能就添加一个resize事件吧。将表头的宽度动态传递给文本框。
一般filter_model的操作性更强

QTableWidget 好像没有行点击或改变的信号,实际上就可以用单元格点击的信号 cellPressed 来实现行列的定位,点击单元格就有返回行、列索引了。

下拉框选择内容改变时,可以通过currentIndexChanged触发,绑定指定函数实现筛选事件。
下面是示例:


self.ui.comb1.currentIndexChanged.connect(self.Comb1Selectionchange)
self.ui.comb2.activated.connect(self.Comb2Selectionchange)

问题2好像有处理方法了,我看有这个文章,https://blog.csdn.net/u013541325/article/details/125860988
问题1还在处理开发中,我会继续更新,争取尽快搞定。

参考