【发布时间】:2017-02-09 19:10:38
【问题描述】:
这里有一些代码可以说明我的问题:
import sys
from PyQt4 import QtGui, QtCore
class CustomButton(QtGui.QAbstractButton):
def __init__(self, *__args):
super().__init__(*__args)
self.setFixedSize(190, 50)
self.installEventFilter(self)
def paintEvent(self, event):
painter = QtGui.QPainter(self)
painter.setBrush(QtGui.QColor(136, 212, 78))
painter.setPen(QtCore.Qt.NoPen)
painter.drawRect(QtCore.QRect(0, 0, 100, 48))
def eventFilter(self, object, event):
if event.type() == QtCore.QEvent.HoverMove:
painter = QtGui.QPainter(self)
painter.begin(self)
painter.drawRect(QtCore.QRect(0, 0, 100, 48))
painter.end()
return True
return False
app = QtGui.QApplication(sys.argv)
window = QtGui.QWidget()
layout = QtGui.QGridLayout(window)
button = CustomButton()
layout.addWidget(button, 0, 0)
window.show()
sys.exit(app.exec_())
目标是使用QPainter 制作一个可以在检测到HoverMove 事件时修改的按钮。但是,悬停时出现以下错误:
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::drawRects: Painter not active
QPainter::end: Painter not active, aborted
根据我从文档 (here) 中了解到的信息,我可以使用 .begin() 来激活 QPainter;但是,正如错误消息显示的那样,情况并非如此,并且第二个矩形没有被绘制。我应该如何使用QPainter 来实现所需的输出?
【问题讨论】:
-
正如文档所说:“警告:当paintdevice是一个小部件时,QPainter只能在paintEvent()函数或由paintEvent()调用的函数中使用; 除非设置了 Qt.WA_PaintOutsidePaintEvent 小部件属性。在 Mac OS X 和 Windows 上,无论该属性的设置如何,您都只能在 paintEvent() 函数中进行绘制。"
-
糟糕,我的错,错过了最重要的部分:/。如果它只能在
paintEvent()中使用,是否可以从带有参数的事件处理程序中调用此方法?
标签: python qt user-interface pyqt pyqt4