私は最近、PyQt 5.7.0から5.7.1に更新され、正しく動作するコードは正常に動作しなくなりました。ですから、私のコードはいつも間違っていましたが、PyQt5はPyqt 5.7.1にバグが導入されました。QTableViewは5.7.1にアップデートして以来、行を表示していません
QAbstractTableModelから継承するカスタムモデルを使用してQTableViewから継承するカスタムテーブルビューがあります。新しい行がモデルに追加されると、テーブルビューに表示されません。実際、行は目に見えるようになりません。いくつかのデバッグを通じて、派生したモデルクラスで期待通りに行数が変化していることを確認しました。
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import PyQt5.Qt
class JobTableModel(QAbstractTableModel):
def __init__(self, data, parent):
super(JobTableModel, self).__init__()
assert isinstance(parent, QTableView), "'parent' is not a QTableView object"
self._parent = parent
self._data = data
self._rows = 0
self._updateModel()
# end constructor
def updateRows(self, rows):
self.layoutAboutToBeChanged.emit()
self._rows = rows
self.layoutChanged.emit()
# end updateRows
def _updateModel(self):
# Only update rows that are visible to the user
# Note: self._parent is a QTableView
minRow = self._parent.rowAt(0)
if minRow >= 0:
maxRow = self._parent.rowAt(self._parent.height())
if maxRow < 0: maxRow = self._rows - 1
for row in range(minRow, maxRow + 1):
self.dataChanged.emit(self.index(row, 0), self.index(row, self.columnCount(None) - 1))
QTimer.singleShot(490, self._updateModel)
# end _updateModel
def headerData(self, section, orientation, role):
if role == Qt.DisplayRole and orientation == Qt.Horizontal:
return str(section)
#
# end headerData
def rowCount(self, modelIndex):
return self._rows
# end rowCount
def columnCount(self, modelIndex):
return 8 # always the same number of columns
# end columnCount
def data(self, index, role):
if not index.isValid(): return None
if role == Qt.DisplayRole: return '{0}, {1}'.format(index.row(), index.column())
return None
# end data
class JobTableView(QTableView):
def __init__(self, data, parent):
super(JobTableView, self).__init__(parent)
self.setModel(JobTableModel(data, self))
self.setAlternatingRowColors(True)
self.setWordWrap(False)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.verticalHeader().setVisible(False)
self.verticalHeader().setDefaultSectionSize(23)
self.setSelectionBehavior(QAbstractItemView.SelectRows)
self.setEditTriggers(QAbstractItemView.NoEditTriggers)
if __name__ == '__main__':
app = QApplication(sys.argv)
tv = JobTableView(None, None)
tv.show()
tv.model().updateRows(1)
app.exec_()
ここに潜在的なバグを報告することは、PyQt5のメンテナーが決してそれらを見ることができないため、ほとんど報告しません。いずれにしても、最初に[SIP](https://www.riverbankcomputing.com/software/sip/download)と[PyQt5](https://www.riverbankcomputing.com/)の最新のスナップショットを使用してテストする必要があります。ソフトウェア/ pyqt/download5)。問題が解決しない場合は、適切な[メーリングリスト](https://www.riverbankcomputing.com/support/lists)にレポートを送信し、問題を再現する小さな自己完結型のテストケースを送信してください。 – ekhumoro
2番目の文が示唆しているように、ここではバグを報告していません。コーディングが間違っているかどうか、バグがあるかどうかを調べようとしています。 – steveo225
明らかにPyQt5にバグがあるか、自分のコードにあります。いずれにしても、最初に最新のスナップショットを使用してテストし、[mcve]を提供する必要があります。 – ekhumoro