QT绘图报警告QPainter::begin: Paint device returned engine == 0, type: 1 原因

QPainter默认只能在paintEvent里面调用,但是在其他事件中绘制窗体,提示信息如下:

QPainter::begin: Paint device returned engine == 0, type: 1
绘制操作应该在paintEvent中完成.
有一个属性值,在构造函数中设置可以在paintEvent()之外进行绘制:
this->setAttribute(Qt::WA_PaintOutsidePaintEvent);
但是只支持X11,对于 Windows, Mac OS X or Embedded Linux。。。。不予支持
void xx::paintEvent(QPaintEvent *p)
{
painter.begin(this);
painter.drawImage(image);
painter.end();
}

总结上述结论如下:
问题原因:
Qt4限定 “只能在自己的paintEvent中(在非Mac和Windows平台,可以设置Qt::WA_PaintOutsidePaintEvent改变这一点)针对自己绘图”,而我企图“在自己的paintEvent中对别人绘图”,故出错。

解决方法:
法1:自定义一个类myPushButton : public QPushButton,然后重写这个类的paintEvent(),在其中完成绘图操作;
法2:使用installEventFilter()为成员QPushButton *b安装事件过滤器,再重写eventFilter(),在其中截获发送给b的paint事件,再对b进行绘图操作。