Pyqt5 QAbstractTableModel dataChanged 不更新数据

问题描述 投票:0回答:2

在通过 pydispatcher 收到系统更改的通知后,我正在尝试更新我的 QTableView。我确实创建了以下功能

def rowCount(self, parent=None):
    return len(self.m_list)

def columnCount(self, parent=None):
    return len(self.table_def)

def headerData(self, col, orientation, role):
    if orientation == Qt.Horizontal and role == Qt.DisplayRole:
        return self.table_def[col]['Header']
    return QVariant()

def data(self, index, role=Qt.DisplayRole):
    if not index.isValid():
        return None
    if index.row() >= len(self.m_list) or index.row() < 0:
        return None

    row = index.row()
    col = index.column()

    print("Called for (%s, %s, %s)" % (row, col, role))
    if role == Qt.DisplayRole:
        return self.table_def[index.column()]['Function'](index.row())
    elif role == Qt.BackgroundRole:
        batch = (index.row() // 100) % 2
        if batch == 0:
            return QApplication.palette().base()

        return QApplication.palette().alternateBase()
    else:
        return None

def flags(self, index):
    if not index.isValid():
        return None
    return Qt.ItemIsEnabled

def update_model(self, data):
    print('update_model')
    index_1 = self.index(0, 0)
    index_2 = self.index(0, 1)
    self.dataChanged.emit(index_1, index_2, [Qt.DisplayRole])

self.dataChanged.emit(index_1, index_2, [Qt.DisplayRole])
行似乎没有做任何事情;即
data(self, index, role=Qt.DisplayRole)
未被调用。

如果我单击表格,则会调用

data(self, index, role=Qt.DisplayRole)
并且表格会更新。

我现在的修复方法是调用 beginResetModel() 和 endResetModel()。这是可行的,但它不应该是这样的。

知道会发生什么吗?

python pyqt pyqt5 qtableview qabstracttablemodel
2个回答
1
投票

我遇到了同样的问题,我只是通过调用 self.headerDataChanged.emit 来解决它。因此,要做到这一点,一旦您更改了表中的某些内容,请调用以下命令:

self.headerDataChanged.emit(Qt.Horizontal, idx1, idx2)

其中 self._data 是类中的数据。 idx1 和 idx2 分别是更改数据的第一个和最后一个索引。

Qt.Horizontal
是一个示例,它可以是垂直的,具体取决于您的表格内容。


0
投票

正如 eleaut 所说,它应该有效。唯一需要注意的是该方法应该在模型上调用。就我而言,是

self.ui_window.tbl_input_data.model().headerDataChanged.emit(
        Qt.Horizontal,
        self.ui_window.tbl_input_data.model().index(0, 0),
        self.ui_window.tbl_input_data.model().index(
            self.model.rowCount(self.get_index()) - 1,
            self.model.columnCount(self.get_index()) - 1)
    )

哪里

ui_window
- 由 QTDesigner 创建的
Ui_Dialog
类实例;
tbl_input_data
-
QTableView
对象。 它确实有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.