【问题标题】:PyQt5 QTableView Updating view on button clickPyQt5 QTableView 点击按钮更新视图
【发布时间】: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


【解决方案1】:
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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-25
    • 2017-05-18
    • 2014-01-18
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    相关资源
    最近更新 更多