【发布时间】:2020-05-13 10:09:30
【问题描述】:
假设我有以下数据框:
df = {'Banana': {0: 1, 1: 2, 2: 5}, 'Apple': {0: 3, 1: 4, 2: 3}, 'Elderberry': {0: 5, 1: 4, 2: 1},
'Clementine': {0: 4, 1: 7, 2: 0}, 'Fig': {0: 1, 1: 9, 2: 3}}
Banana Apple Elderberry Clementine Fig
0 1 3 5 4 1
1 2 4 4 7 9
2 5 3 1 0 3
传递给QAbstractTableModel并与QTableView一起显示:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import Qt
import pandas as pd
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, model):
super().__init__()
self.model = model
self.table = QtWidgets.QTableView()
self.table.setModel(self.model)
self.setCentralWidget(self.table)
class TableModel(QtCore.QAbstractTableModel):
def __init__(self, data):
super(TableModel, self).__init__()
self._data = data
def rowCount(self, index):
return self._data.shape[0]
def columnCount(self, index):
return self._data.shape[1]
def headerData(self, section, orientation, role):
# section is the index of the column/row.
if role == Qt.DisplayRole:
if orientation == Qt.Horizontal:
return str(self._data.columns[section])
if orientation == Qt.Vertical:
return str(self._data.index[section])
def data(self, index, role):
row = index.row()
column = index.column()
column_name = self._data.columns[column]
value = self._data.iloc[row, column]
if role == Qt.DisplayRole:
print(str(value))
return str(value)
app = QtWidgets.QApplication(sys.argv)
df = {'Banana': {0: 1, 1: 2, 2: 5}, 'Apple': {0: 3, 1: 4, 2: 3}, 'Elderberry': {0: 5, 1: 4, 2: 1}, 'Clementine': {0: 4, 1: 7, 2: 0}, 'Fig': {0: 1, 1: 9, 2: 3}}
data_model = TableModel(df)
window1 = MainWindow(data_model)
window1.resize(800, 400)
window1.show()
sys.exit(app.exec_())
我现在想使用QListView 创建一个单独的窗口,以显示df 列名的列表,允许我指定要在上面的QTableView 中出现的列。 Like this:
如果我取消选中 QListView 中的列,我希望从 QTableView 中删除该列。同样,如果我检查一列,则该列应添加到表视图中。列表视图的目的本质上是允许用户指定哪些列应该出现在表格中。
这样做的最佳方法是什么?我想我可以创建一个QListWidget 并使用信号来更新QTableView。但是我有点不愿意这样做,因为我想它会变得非常混乱。
因此最佳做法是使用QListView,以便两个小部件引用相同的数据模型,并自动talk to each other like this?
【问题讨论】: