programming python qt

[PyQt4]カスタムデリゲート

[PyQt4]カスタムデリゲート

C++のQt4と平行してPyQt4を使い始めた。大概の用途にはこっちで十分な気がする。 pyqtのチュートリアルには、

がいい。wxWidgetsとかgtkでも世話になったが、ここのチュートリアルはサンプルが小さいので助かる。

ビューのアイテム表示をカスタマイズするデリゲートについて調査中。

# !/usr/bin/python
# -*- coding: utf-8 -*-

import sys from PyQt4 import QtGui, QtCore from random import randint

class CustomDelegate(QtGui.QItemDelegate):

def __init__(self, parent = None):

super(CustomDelegate, self).__init__(parent) self.editor = QtGui.QSpinBox()

# 編集時

# create widget def createEditor(self, parent, styleOption, index): editor = QtGui.QSpinBox(parent) return editor

# model to editor def setEditorData(self, editor, index): data=index.model().data(index, QtCore.Qt.EditRole) editor.setValue(data.toInt()[0])

# editor to model def setModelData(self, editor, model, index): model.setData(index, editor.value())

def updateEditorGeometry(self, editor, option, index):

editor.setGeometry(option.rect)

# 通常時

# item render def paint(self, painter, option, index): widget = QtGui.QLabel() #widget = QtGui.QSpinBox() data=index.model().data(index, QtCore.Qt.EditRole) widget.setText(data.toString()[0]) #widget.setValue(data.toInt()[0]) widget.setGeometry(option.rect) # border ? point=QtCore.QPoint(option.rect.left()+2, option.rect.top()+2) widget.render(painter, point)

# item一個分の大きさ

def sizeHint(self, option, index):

self.editor.setGeometry(option.rect) return self.editor.sizeHint()

def main():

app = QtGui.QApplication(sys.argv)

# setup model model = QtGui.QStandardItemModel() for n in range(10): item = QtGui.QStandardItem(‘%s’ % randint(1, 100)) model.appendRow(item)

view = QtGui.QListView() view.setModel(model) view.setItemDelegate(CustomDelegate()) view.show()

sys.exit(app.exec_())

if __name__ == ‘__main__‘:

main()

QItemDelegateは非編集時のアイテム描画にpaintメソッドを使い、編集時の描画にcreateEditor, setEditorData, setModelData, updateEditorGeometryを使う。カスタムデリゲートにするとアイテムの大きさが変わりそうなのでsizeHintも実装するとよさげ。