【发布时间】:2021-02-03 06:46:37
【问题描述】:
当按下按钮时,如何让我的 QTableView 更新?利用 pandas 数据框和标准设置作为表的数据源。我知道它不是(addWidget(self.view) 只调用一次),但是我需要更改什么才能更新它? (代码中的 print(data) 确认数据框正在更新)
class QModel(QAbstractTableModel):
def __init__(self, data):
QAbstractTableModel.__init__(self)
self._data = data
def rowCount(self, parent=None):
return self._data.shape[0]
def columnCount(self, parent=None):
return self._data.shape[1]
def data(self, index, role=Qt.DisplayRole):
if index.isValid():
if role == Qt.DisplayRole:
return str(self._data.iloc[index.row(), index.column()])
return None
def headerData(self, col, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self._data.columns[col]
return None
class Tabs_Widget(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('Adjustments')
self.df = pd.DataFrame()
self.add = QPushButton('Add Line')
self.add.clicked.connect(self.addLine)
self.viewmodel = self.tableView(self.df)
self.layout = QVBoxLayout(self)
self.layout.addWidget(self.add)
self.layout.addWidget(self.view)
self.show()
def addLine(self, items):
self.df = self.df.append([[1,2]])
# print(self.df)
self.tableView(self.df)
def tableView(self, data):
print("data")
print(data)
model = QModel(data)
self.view = QTableView()
self.view.setModel(model)
self.view.setAlternatingRowColors(True)
self.view.setSizeAdjustPolicy(QTableView.AdjustToContents)
if __name__ == '__main__':
app = 0
app = QApplication(sys.argv)
win = Tabs_Widget()
sys.exit(app.exec_())
【问题讨论】:
-
我不是 pandas 方面的专家,所以我不能给你一个充分的答案,但请考虑以下几点:你每次都试图创建一个 new 表,而不是重用当前表,新表将永远显示,并且每次调用
addLine时总是被另一个新表替换(不会再次显示)。简单的解决方案是再次创建模型并在 existing 表上使用setModel(),但这肯定不是一个好的选择,因为模型应该更新,不是 i> 替换。 -
为了做到这一点,你应该对 pandas 进行自己的研究,并通过调用(在需要时)
beginInsertRows()在创建一个新行(或beginInsertColumns用于任何新列),然后更新现有数据框中的布局,并调用endInsertRows()(或endInsertColumns()) 之后。 -
谢谢musicamante。我不太确定如何完成您提到的内容,但有点摸不着头脑,我得到了答案,如下所示。
标签: python pyqt5 qtableview