Python PyQt5 QTableView在按钮单击时更新视图
当按下按钮时,如何使我的QTableView更新?利用熊猫数据框和标准设置作为表的数据源。我知道它不是(addWidget(self.view)只调用一次),但我需要做什么更改才能更新它呢?(代码中的打印(数据)确认数据帧正在更新)Python PyQt5 QTableView在按钮单击时更新视图,python,pyqt5,qtableview,Python,Pyqt5,Qtableview,当按下按钮时,如何使我的QTableView更新?利用熊猫数据框和标准设置作为表的数据源。我知道它不是(addWidget(self.view)只调用一次),但我需要做什么更改才能更新它呢?(代码中的打印(数据)确认数据帧正在更新) 我不是大熊猫的专家,所以我不能给你一个适当的答案,但是考虑下面的内容:你尝试每次创建一个新的表,而不是重用当前的表,新的表将永远不会被显示,并且总是被另一个新的表替换(它不会再被显示)。简单的解决方案是重新创建模型,只需在现有表上使用setModel(),但这肯定不
我不是大熊猫的专家,所以我不能给你一个适当的答案,但是考虑下面的内容:你尝试每次创建一个新的表,而不是重用当前的表,新的表将永远不会被显示,并且总是被另一个新的表替换(它不会再被显示)。简单的解决方案是重新创建模型,只需在现有表上使用
setModel()
,但这肯定不是一个好的选择,因为模型应该更新,而不是替换。为此,您应该对pandas进行自己的研究,并通过调用(在需要时)正确实现Qt模型中的更改在创建新行(或任何新列的beginInsertColumns
)之前,请更新现有数据帧中的布局,然后调用endInsertRows()
(或endInsertColumns()
),谢谢musicamante。我不太确定如何实现你提到的目标,但一点欺骗让我得到了下面的答案。
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_())
class Tabs_Widget(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('Adjustments')
self.df = pd.DataFrame()
self.model = QModel(self.df)
self.view = QTableView()
self.view.setModel(self.model)
self.view.setAlternatingRowColors(True)
self.view.setSizeAdjustPolicy(QTableView.AdjustToContents)
self.add = QPushButton('Add Line')
self.add.clicked.connect(self.addLine)
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]])
self.view.setModel(QModel(self.df))