如何在QStyledItemDelegate中绘制带样式的焦点矩形?

2024-10-01 05:01:35 发布

您现在位置:Python中文网/ 问答频道 /正文

PyQt邮件列表中Benno Dielmann提出的以下问题自2008年以来一直没有得到答复:

[…] 我有一个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单元格中获取焦点帧的常用方法是什么?[…]


Tags: self列表绘制邮件pyqt焦点optionpaint
1条回答
网友
1楼 · 发布于 2024-10-01 05:01:35

我也遇到了同样的问题。在经历了很多挫折之后,我在被弃用的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()

相关问题 更多 >