Я реализует QTableView
с пользовательской моделью, и мне нужна ячейка, которая выглядит следующим образом: http://oi47.tinypic.com/2jirkw.jpgPySide делегат на QTableView с текстом и отметьте
В настоящее время я использую ниже делегат (адаптировано из других ответов) на нарисуйте флаг (цветной текст html) в одной ячейке, щелкнув по целой ячейке, измените флаг.
class HTMLDelegate(QtGui.QStyledItemDelegate):
def Doc(self, options):
if options.text == "0":
return ""
elif options.text == "1":
return "<b><font align='right' color='green'>V</font></b>"
elif options.text == "2":
return "<font align='right' color='#FF8400'>!!</font>"
elif options.text == "3":
return "<b><font align='right' color='#CC0000'>F</font></b>"
elif options.text == "4":
return "<b><font align='right' color='#000000'>X</font></b>"
def paint(self, painter, option, index):
options = QtGui.QStyleOptionViewItemV4(option)
self.initStyleOption(options,index)
style = QtGui.QApplication.style() if options.widget is None else options.widget.style()
doc = QtGui.QTextDocument()
background = None
doc.setHtml(self.Doc(options))
options.text = ""
style.drawControl(QtGui.QStyle.CE_ItemViewItem, options, painter);
ctx = QtGui.QAbstractTextDocumentLayout.PaintContext()
# Highlighting text if item is selected
#if (optionV4.state & QStyle::State_Selected)
# ctx.palette.setColor(QPalette::Text, optionV4.palette.color(QPalette::Active, QPalette::HighlightedText));
textRect = style.subElementRect(QtGui.QStyle.SE_ItemViewItemText, options, None)
painter.save()
if background:
painter.fillRect(options.rect, QtCore.Qt.yellow)
painter.translate(textRect.topLeft())
painter.setClipRect(textRect.translated(-textRect.topLeft()))
doc.documentLayout().draw(painter, ctx)
painter.restore()
def editorEvent(self, event, model, option, index):
if not (index.flags() & QtCore.Qt.ItemIsEditable) > 0:
return False
# Do not change the checkbox-state
if event.type() == QtCore.QEvent.MouseButtonRelease or event.type() == QtCore.QEvent.MouseButtonDblClick:
if event.button() != QtCore.Qt.LeftButton:
return False
if event.type() == QtCore.QEvent.MouseButtonDblClick:
return True
elif event.type() == QtCore.QEvent.KeyPress:
if event.key() != QtCore.Qt.Key_Space and event.key() != QtCore.Qt.Key_Select:
return False
else:
return False
# Change the flag-state
self.setModelData(None, model, index)
return False
def setModelData (self, editor, model, index):
'''
The user wanted to change the old flag into the next
'''
#newValue = not bool(index.model().data(index, QtCore.Qt.DisplayRole))
#model.setData(index, newValue, QtCore.Qt.EditRole)
oldFlagIndex = model.index(index.row(), COD_COL_FLAGS)
oldFlag = model.data(oldFlagIndex)
if type(oldFlag) == long:
newFlag = oldFlag + 1
if newFlag > 4:
newFlag = 0
else:
newFlag = 0
model.setData(index, newFlag, QtCore.Qt.EditRole)
Как это сделать?
Вариантов, которые я имею в виду, являются:
делегат, который рисует текст (богатый или простой), а также с пиксельной справа
делегат, который рисует две строки текста (одна нормальный и один богатый, или как форматированный текст) выровнены один слева и один справа
в качестве упражнения, но не требуется для приложения, было бы неплохо, чтобы вызвать только изменение флага при нажатии на нем вместо wh оле.
Благодаря
Какие еще ответы? Было бы очень полезно предоставить ссылки, чтобы мы могли видеть. – neuronet