pyside6 的tableview中怎么做出像EXCEL一样的查找功能,用代码举例
时间: 2024-03-12 19:44:57 浏览: 208
類似於excel的dataview
要实现Pyside6 TableView的查找功能,可以使用QSortFilterProxyModel来过滤模型中的数据。以下是一个简单的示例代码:
```python
from PySide6 import QtWidgets, QtCore
class TableView(QtWidgets.QTableView):
def __init__(self):
super().__init__()
# 创建模型和代理模型
self.model = QtWidgets.QStandardItemModel()
self.proxy_model = QtCore.QSortFilterProxyModel(self)
self.proxy_model.setSourceModel(self.model)
self.setModel(self.proxy_model)
# 添加数据到模型中
for row in range(10):
for column in range(4):
item = QtWidgets.QStandardItem(f"Item {row+1}-{column+1}")
self.model.setItem(row, column, item)
# 添加查找框和按钮
self.search_line_edit = QtWidgets.QLineEdit()
self.search_button = QtWidgets.QPushButton("Search")
self.search_button.clicked.connect(self.search)
# 将查找框和按钮添加到工具栏中
toolbar = QtWidgets.QToolBar()
toolbar.addWidget(self.search_line_edit)
toolbar.addWidget(self.search_button)
self.addToolBar(toolbar)
def search(self):
# 获取查找关键字
search_text = self.search_line_edit.text()
# 设置过滤器
self.proxy_model.setFilterRegExp(search_text)
self.proxy_model.setFilterKeyColumn(0)
```
在这个示例中,我们创建了一个TableView,并添加了一个模型和代理模型。我们还添加了一个查找框和按钮,当用户单击按钮时,我们使用setFilterRegExp()方法设置QSortFilterProxyModel的过滤器,以过滤与查找关键字匹配的行。注意,我们使用setFilterKeyColumn()方法指定要在哪一列中进行查找。
当用户输入查找关键字并单击按钮后,TableView将只显示与查找关键字匹配的行。用户可以通过清除搜索框中的文本来取消过滤器。
阅读全文
相关推荐
还不是很完善,可以自己加以封装
// JavaScript Document
var BoxWidth = 700// 资料表显示宽度 ( 不含卷轴 )
var ShowLine = 15// 资料表显示列数
var RsHeight = 21// 资料列高度
var LockCols = 1// 要锁定的栏位数 ( 由左至右 )
function WriteTable(){// 写入表格
var iBoxWidth=BoxWidth
var NewHTML=""
for(i=0;i<DataTitles.length;i++){
if(i<LockCols){
var cTitle=DataTitles[i].split("#")
iBoxWidth-=cTitle[1]
var DynTip=((i+1)==LockCols)?"解除锁定":"锁定此栏位"
NewHTML+="<td><span>"+cTitle[0]+""
}
}
NewHTML+=" "
for(i=0;i<DataTitles.length;i++){
if(i>=LockCols){
var cTitle=DataTitles[i].split("#")
NewHTML+=""+cTitle[0]+" "
}
}
NewHTML+=" "
DataTable.innerHTML=NewHTML
ApplyData()
}
function ApplyData(){// 写入资料
var NewHTML=""
for(i=0;i<DataFields.length;i++){
NewHTML+="<tr>"
for(j=0;j<DataTitles.length;j++){
if(j<LockCols){
var cTitle=DataTitles[j].split("#")
NewHTML+="<td><span>"+DataFields[i][j]+""
}
}
NewHTML+=""
}
NewHTML+=""
DataGroup1.innerHTML=NewHTML
var NewHTML=""
for(i=0;i<DataFields.length;i++){
NewHTML+="<tr>"
for(j=0;j<DataTitles.length;j++){
if(j>=LockCols){
var cTitle=DataTitles[j].split("#")
NewHTML+=""+DataFields[i][j]+" "
}
}
NewHTML+=""
}
NewHTML+=""
DataGroup2.innerHTML=NewHTML
DataFrame1.style.pixelHeight=RsHeight*ShowLine
DataFrame2.style.pixelHeight=RsHeight*ShowLine
DataFrame3.style.pixelHeight=RsHeight*ShowLine+RsHeight
DataGroup3.style.pixelHeight=RsHeight*(DataFields.length+1)
}
function ResetTable(n){
var iBoxWidth=0
for(i=0;i<DataTitles.length;i++){
if(i<(n+1)){
var cTitle=DataTitles[i].split("#")
iBoxWidth+=parseInt(cTitle[1])
}
}
if(iBoxWidth>BoxWidth){
var Sure=confirm("\n锁定栏位的宽度大於资料表显示的宽 \n\n度,这可能会造成版面显示不正常。\n\n\n您确定要继续吗?")
}else{
Sure=true
}
if(Sure){
LockCols=(LockCols==n+1)?0:n+1
WriteTable()
}
}
function SYNC_Roll(){
DataGroup1.style.posTop=-DataFrame3.scrollTop
DataGroup2.style.posTop=-DataFrame3.scrollTop
}
window.onload=WriteTable