使用 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
问题解决
我正在尝试制作我自己的使用 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
问题解决