2016-10-08 13 views
1

현재 모델 뷰 방식으로 머리를 감싸고 축소판 뷰어 응용 프로그램을 작성하려고합니다.QStyledItemDelegate 페인트 새로 고침 문제

이 예에서는 20 개의 상자를 그리기 만하면 마우스 움직임을 업데이트하는 무작위 선택 항목이 표시됩니다. 스크롤하면 사태가 더욱 악화되고 때로는 상자 등이 그려 지기도합니다. 또한 텍스트는 전혀 렌더링되지 않은 것처럼 보입니다.

내게는 페인트 방법의 새로 고침/업데이트 문제처럼 보입니다. 여기에 뭔가가 빠졌습니까?

paint problem

는 궁극적으로 나는 많은 항목을 표시해야합니다. 모두 몇 개의 레이블과 런타임에 업데이트해야하는 픽스맵을 포함합니다. 그래서 저는 그것들을 그리는 것이 가장 빠른 해결책이라고 생각했습니다. 또는 페인트 메서드에서 위젯을 렌더링하려고 시도했습니다.

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()