2016-10-08 24 views
1

私は現在、モデルビューのアプローチで自分の頭を包み込み、サムネイルビューアアプリケーションを作成しようとしています。QStyledItemDelegateペイントの更新の問題

この例では、単に20個のボックスを描画しようとしていますが、マウスの動きを更新するランダムな選択肢のように見えます。スクロールすると状態がさらに悪くなり、時にはボックスなどしか描画されません。また、テキストもレンダリングされないようです。

私にとっては、ペイント方法の更新/更新の問題のようです。 ここに何か不足していますか?

paint problem

最終的に私は多くの項目を表示する必要があります。すべては、いくつかのラベルと、実行時に更新する必要があるpixmapを含んでいます。だから、私はそれらの絵を最速の解決策と考えました。代わりに私はpaintメソッドで私のウィジェットをレンダリングしてみました:遅いと思わ

customWidget.render(painter, QtCore.QPoint(0,0), renderFlags=QtGui.QWidget.DrawChildren) 

が、少なくとも作業します。事前に

import sys 
from PySide import QtCore 
from PySide import QtGui 

elements = range(20) 

class ElementListModel(QtCore.QAbstractListModel): 
    def __init__(self, elements = [], parent = None): 
     super(ElementListModel, self).__init__() 
     self.__elements = elements 

    def rowCount(self, parent): 
     return len(self.__elements) 

    def data(self, index, role): 
     if role == QtCore.Qt.DisplayRole: 
      return str(self.__elements[index.row()]) 

class ElementThumbDelegate(QtGui.QStyledItemDelegate): 
    def __init__(self, view, parent=None): 
     super(ElementThumbDelegate, self).__init__(parent) 

    def paint(self, painter, options, index): 

     width = options.rect.width() 
     height = options.rect.height() 

     painter.setRenderHint(QtGui.QPainter.Antialiasing) 
     painter.setPen(QtGui.QColor(255, 255, 255)) 
     painter.setBrush(QtGui.QColor(10, 10, 10)) 
     painter.drawRect(0, 0, width, height) 
     painter.drawText(options.rect, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter, str(index.data())) 
     painter.translate(options.rect.topLeft()) 

    def sizeHint(self, options, index): 
     return QtCore.QSize(50, 50) 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    viewer = QtGui.QListView() 

    viewModel = ElementListModel(elements) 
    viewer.setModel(viewModel) 
    viewer.setViewMode(QtGui.QListView.IconMode) 
    viewer.setItemDelegate(ElementThumbDelegate(viewer)) 

    viewer.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

ありがとう:

は、ここに私の問題を説明するための最小限の実施例です。どんな助けや指針が次に見えるかは非常に高く評価されます!

答えて

1

painter.translate()は、ビューアの起点(0,0)にあるボックスを描画すると、自動配置に闘って問題を引き起こしていました。

適切な位置への代理人の翻訳は、ビュー自体によって処理されます。手動で行う必要はありません。

の作業コード:

import sys 
from PySide import QtCore 
from PySide import QtGui 

elements = range(20) 

class ElementListModel(QtCore.QAbstractListModel): 
    def __init__(self, elements = [], parent = None): 
     super(ElementListModel, self).__init__() 
     self.__elements = elements 

    def rowCount(self, parent): 
     return len(self.__elements) 

    def data(self, index, role): 
     if role == QtCore.Qt.DisplayRole: 
      return str(self.__elements[index.row()]) 

class ElementThumbDelegate(QtGui.QStyledItemDelegate): 
    def __init__(self, view, parent=None): 
     super(ElementThumbDelegate, self).__init__(parent) 

    def paint(self, painter, options, index): 
     painter.setRenderHint(QtGui.QPainter.Antialiasing) 
     painter.setPen(QtGui.QColor(255, 255, 255)) 
     painter.setBrush(QtGui.QColor(10, 10, 10)) 
     painter.drawRect(options.rect) 
     painter.drawText(options.rect, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter, str(index.data())) 

    def sizeHint(self, options, index): 
     return QtCore.QSize(50, 50) 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    viewer = QtGui.QListView() 

    viewModel = ElementListModel(elements) 
    viewer.setModel(viewModel) 
    viewer.setViewMode(QtGui.QListView.IconMode) 
    viewer.setItemDelegate(ElementThumbDelegate(viewer)) 

    viewer.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main()