weixin18865481526 2022-11-29 22:15 采纳率: 50%
浏览 161
已结题

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解释

  • 写回答

6条回答 默认 最新

  • ChEnGeRd 2022-11-30 15:42
    关注
    获得5.50元问题酬金

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

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

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

    希望对你有帮助

    评论

报告相同问题?

问题事件

  • 系统已结题 12月7日
  • 赞助了问题酬金20元 12月1日
  • 赞助了问题酬金20元 11月30日
  • 创建了问题 11月29日

悬赏问题

  • ¥15 msix packaging tool打包问题
  • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线