使用 QStylePainter 绘制 FocusRect

Painting FocusRect with QStylePainter

我正在尝试制作我自己的使用 QStyle 选项的小部件,以赋予它 "native" 外观和感觉。 第 1 步将绘制一个简单的 FocusRect,我试图这样完成它:

import sys

from PyQt5 import QtWidgets, QtGui


class MyWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

    def paintEvent(self, event):
        painter = QtWidgets.QStylePainter(self)
        option = QtWidgets.QStyleOptionFocusRect()
        option.initFrom(self)
        option.backgroundColor = self.palette().color(QtGui.QPalette.Background)
        painter.drawPrimitive(QtWidgets.QStyle.PE_FrameFocusRect, option)


if __name__ == '__main__':
    qApp = QtWidgets.QApplication(sys.argv)
    qApp.setStyle('fusion')

    window = QtWidgets.QMainWindow()

    window.widget = MyWidget(window)
    window.widget.resize(100, 100)
    window.widget.move(50, 50)

    window.setFixedSize(200, 200)
    window.show()

    sys.exit(qApp.exec_())

不幸的是,这只给我一个空 window。我错过了什么?

事实证明,FrameFocusRect 仅在其实际具有焦点时才被绘制。

paintEvent方法中添加option.state |= QtWidgets.QStyle.State_KeyboardFocusChange问题解决