私は現在、モデル ビュー アプローチに頭を悩ませ、サムネイル ビューア アプリケーションを作成しようとしています。
この例では、単純に 20 個のボックスを描画しようとしていますが、マウスの動きで更新されるランダムな選択のように見えます。スクロールすると事態がさらに悪化し、描画にボックスなどしか表示されないことがあります。また、テキストがまったくレンダリングされないようです。
私には、ペイント メソッドの更新/更新の問題のように見えます。ここで何か不足していますか?
最終的には、たくさんのアイテムを表示する必要があります。すべてには、いくつかのラベルと、実行時に更新する必要があるピックスマップが含まれています。だから私はそれらを描くことが最速の解決策になると思いました. 別の方法として、次のようにペイント メソッドでウィジェットをレンダリングしてみました。
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()
前もって感謝します。次に探すべきヘルプやポインタは大歓迎です!