将dataframe数据加入到pyqt5 tableview中,多线程加载方式,并要求tableview具有筛选功能,筛选出满足条件的行,要求不能用pyqt.PandasModel
时间: 2024-05-10 12:20:45 浏览: 260
以下是一个例子,使用QStandardItemModel加载数据并实现筛选功能:
```
import pandas as pd
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtWidgets import QApplication, QTableView, QLineEdit, QVBoxLayout, QWidget
class LoadDataThread(QThread):
data_loaded = pyqtSignal(pd.DataFrame)
def __init__(self, parent=None):
super().__init__(parent)
def run(self):
# 加载数据
data = pd.read_csv('data.csv')
# 发送数据加载完成信号
self.data_loaded.emit(data)
class TableView(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.model = QStandardItemModel()
self.tableview = QTableView()
self.filter_edit = QLineEdit()
self.filter_edit.setPlaceholderText('Filter...')
self.filter_edit.textChanged.connect(self.filter_table)
layout = QVBoxLayout()
layout.addWidget(self.filter_edit)
layout.addWidget(self.tableview)
self.setLayout(layout)
self.thread = LoadDataThread()
self.thread.data_loaded.connect(self.load_data)
self.thread.start()
def load_data(self, data):
# 将数据加载到model中
self.model.clear()
self.model.setHorizontalHeaderLabels(data.columns)
for i in range(data.shape[0]):
row = []
for j in range(data.shape[1]):
item = QStandardItem(str(data.iloc[i, j]))
row.append(item)
self.model.appendRow(row)
self.tableview.setModel(self.model)
def filter_table(self):
# 筛选出满足条件的行
text = self.filter_edit.text()
for i in range(self.model.rowCount()):
if text == '':
self.tableview.setRowHidden(i, False)
else:
match = False
for j in range(self.model.columnCount()):
if text.lower() in self.model.item(i, j).text().lower():
match = True
break
self.tableview.setRowHidden(i, not match)
if __name__ == '__main__':
app = QApplication([])
tableview = TableView()
tableview.show()
app.exec_()
```
其中,LoadDataThread是一个继承自QThread的线程类,用于异步加载数据。加载完成后,发射data_loaded信号,将数据传递给TableView类的load_data方法,将数据加载到QStandardItemModel中,并设置到QTableView中显示。
筛选功能在filter_table方法中实现,将符合条件的行设置为可见,不符合条件的行设置为隐藏。在输入框中输入文本时,会自动调用filter_table方法进行筛选。
阅读全文