自2008年以来,来自PyQt邮件列表的Benno Dielmann提出的以下问题未得到答复:
[..] 我有一个QStyledItemDelegate子类,它实现了paint()来绘制一些QTableView单元格的内容。如果其中一个单元格具有焦点,如何使其绘制焦点矩形?我试过这个:
class MyDelegate(QStyledItemDelegate):
...
def paint(self, painter, option, index):
...
painter.save()
if option.state & QStyle.State_HasFocus:
self.parent().style().drawPrimitive(QStyle.PE_FrameFocusRect, option, painter)
...
painter.restore()
但这根本不起作用。没有错误,没有焦点框架。我只是希望QStyle系统以某种方式绘制通常的焦点框架,如果我的一个自定义绘制的单元格具有焦点。 QStyle文档告诉我创建一个QStyleOptionFocusRect并使用initFrom()。但是initFrom()需要一个我在这种情况下不具备的QWidget。
我只是不明白。
在自定义代表绘制的QTableView单元格中获取焦点框架的常用方法是什么?[..]
答案 0 :(得分:0)
我遇到了同样的问题。在非常沮丧之后,我发现答案隐藏在弃用的QStyledItem类中。这是基于该代码的PyQt / PySide解决方案:
class MyDelegate(QtGui.QStyledItemDelegate):
...
def drawFocus(self, painter, option, rect, widget=None):
if (option.state & QtGui.QStyle.State_HasFocus) == 0 or not rect.isValid():
return
o = QtGui.QStyleOptionFocusRect()
# no operator= in python, so we have to do this manually
o.state = option.state
o.direction = option.direction
o.rect = option.rect
o.fontMetrics = option.fontMetrics
o.palette = option.palette
o.state |= QtGui.QStyle.State_KeyboardFocusChange
o.state |= QtGui.QStyle.State_Item
cg = QtGui.QPalette.Normal if (option.state & QtGui.QStyle.State_Enabled) else QtGui.QPalette.Disabled
o.backgroundColor = option.palette.color(cg, QtGui.QPalette.Highlight if (option.state & QtGui.QStyle.State_Selected) else QtGui.QPalette.Window)
style = widget.style() if widget else QtGui.QApplication.style()
style.drawPrimitive(QtGui.QStyle.PE_FrameFocusRect, o, painter, widget)
def paint(self, painter, option, index):
painter.save()
# ... draw your delegate here, or call your widget's render method ...
painter.restore()
painter.save()
# omit the last argument if you're not drawing a widget
self.drawFocus(painter, option, option.rect, widget)
painter.restore()