Python PyQt5 QTableView在按钮单击时更新视图

Python PyQt5 QTableView在按钮单击时更新视图,python,pyqt5,qtableview,Python,Pyqt5,Qtableview,当按下按钮时,如何使我的QTableView更新?利用熊猫数据框和标准设置作为表的数据源。我知道它不是(addWidget(self.view)只调用一次),但我需要做什么更改才能更新它呢?(代码中的打印(数据)确认数据帧正在更新) 我不是大熊猫的专家,所以我不能给你一个适当的答案,但是考虑下面的内容:你尝试每次创建一个新的表,而不是重用当前的表,新的表将永远不会被显示,并且总是被另一个新的表替换(它不会再被显示)。简单的解决方案是重新创建模型,只需在现有表上使用setModel(),但这肯定不

当按下按钮时,如何使我的QTableView更新?利用熊猫数据框和标准设置作为表的数据源。我知道它不是(addWidget(self.view)只调用一次),但我需要做什么更改才能更新它呢?(代码中的打印(数据)确认数据帧正在更新)


我不是大熊猫的专家,所以我不能给你一个适当的答案,但是考虑下面的内容:你尝试每次创建一个新的表,而不是重用当前的表,新的表将永远不会被显示,并且总是被另一个新的表替换(它不会再被显示)。简单的解决方案是重新创建模型,只需在现有表上使用
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))