代码前提,因为使用的是数据模型所以使用的是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_())
我想先实现自适应然后再去做筛选框内容触发的筛选事件。单个窗口的筛选我已经能做了,但是多个列都要添加筛选框还没有思路
self.filter_proxy_model还有.setFilterRole()这个方法应该有点啥用?
点击行与列的方法,我记得有个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还在处理开发中,我会继续更新,争取尽快搞定。