Рисование FocusRect с помощью QStylePainter

Я пытаюсь создать свой собственный виджет, который использует параметры QStyle, чтобы придать ему «родной» внешний вид. Шагом 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_())

К сожалению, это дает мне только пустое окно. Что мне не хватает?


person sonovice    schedule 07.05.2016    source источник


Ответы (1)


Оказывается, FrameFocusRect рисуется только тогда, когда он действительно имеет фокус.

Добавление option.state |= QtWidgets.QStyle.State_KeyboardFocusChange в метод paintEvent решает проблему.

person sonovice    schedule 16.05.2016