2017-01-16 9 views
1

私は最近、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_() 
+0

ここに潜在的なバグを報告することは、PyQt5のメンテナーが決してそれらを見ることができないため、ほとんど報告しません。いずれにしても、最初に[SIP](https://www.riverbankcomputing.com/software/sip/download)と[PyQt5](https://www.riverbankcomputing.com/)の最新のスナップショットを使用してテストする必要があります。ソフトウェア/ pyqt/download5)。問題が解決しない場合は、適切な[メーリングリスト](https://www.riverbankcomputing.com/support/lists)にレポートを送信し、問題を再現する小さな自己完結型のテストケースを送信してください。 – ekhumoro

+0

2番目の文が示唆しているように、ここではバグを報告していません。コーディングが間違っているかどうか、バグがあるかどうかを調べようとしています。 – steveo225

+0

明らかにPyQt5にバグがあるか、自分のコードにあります。いずれにしても、最初に最新のスナップショットを使用してテストし、[mcve]を提供する必要があります。 – ekhumoro

答えて

0

IはPyQtは-5.7、PyQtは、5.7.1および(SIP-4.19.1.dev1701101411で構築)PyQtは-5.7.2.dev1701131704を使用してテストケースを実行しました。この問題は、PyQt-5.7.1では再現可能ですが、他の2つのバージョンでは再現できません。コメントに示唆されているように、PyQt-5.7.1にはバグがあり、最新のスナップショットではすでに修正されています。

関連する問題