Ошибка? В PyQt5 реализация rowCount () для QStandardItemModel имеет странные эффекты - PullRequest
0 голосов
/ 29 апреля 2020

Я просто хотел реализовать против QStandardItemModel и попытался rowCount() вернуть | строки | +1, чтобы показать дополнительную строку. Я бы реализовал data() и flags() соответственно, чтобы показать допустимые значения для дополнительной строки.

Но теперь я запутался. Дополнительная линия рисуется (поэтому метод реализован правильно), но data() и flags() будут всегда вызываться с индексом внутри внутренней модели данных. Кроме того, мое приложение дает сбой примерно в 50% случаев.

Таким образом, похоже, что rowCount() не используется для каждого случая, когда его следует использовать , что приводит к недопустимому доступу к внутреннему. данные ..

Это ошибка?

Я использую PyQt5-5.14.0 на Linux (Ubuntu 18.04)

from PyQt5 import QtWidgets, QtGui, QtCore


class MyModel(QtGui.QStandardItemModel):
    def __init__(self):
        super().__init__()
        self.appendRow([QtGui.QStandardItem("Hi"), QtGui.QStandardItem("there")])
        self.appendRow([QtGui.QStandardItem("Hello"), QtGui.QStandardItem("world")])

    def rowCount(self, parent):
        return super().rowCount() + 1

    def data(self, index: QtCore.QModelIndex, role: QtCore.Qt.ItemDataRole):
        assert index.row() < 2  # index.row() is always in [-1, 0, 1]
        return super().data(index, role)

    def flags(self, index: QtCore.QModelIndex) -> QtCore.Qt.ItemFlags:
        assert index.row() < 2  # index.row() is always in [-1, 0, 1]
        return super().flags(index)


class Testing(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        model = MyModel()
        view = QtWidgets.QTableView(self)
        view.setModel(model)
        self.setCentralWidget(view)
        self.show()


if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    test = Testing()
    raise SystemExit(app.exec_())

1 Ответ

0 голосов
/ 29 апреля 2020

Я забыл реализовать index():

def index(self, row, column, parent):
    return super().index(row, column) if row < super().rowCount() else self.createIndex(row, column)

Объяснение: super().index() создаст недопустимый индекс для строк> | внутренние данные | в результате flags() или data() вообще не вызывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...