paintEvent可以进行Qt绘图,但是每次都将背景图片擦拭,
Qt在C++窗口画图时,窗体自带的标题栏、状态栏,也一同会被擦拭,带来不便,
注意到paintEvent一进去窗体就会触发一次,此时已经完成窗体背景擦拭,
所以我们应该考虑换一个函数,如eventFilter(QObject *,QEvent *)
eventFilter()事件过滤器,窗体有任何事件都会触发该函数,
我们通过eventFilter(),可以在控件上画图,比如说label,
既然是用到控件label,首先要在ui文件拖入控件label,其次例子如下:
.h
#include "QtGui/QPainter.h"
protected:
//void paintEvent( QPaintEvent *painter );
bool eventFilter(QObject *obj,QEvent *event);
void labelPaint();
.cpp
setupUi(this);//找到这行代码,在下面添加:
this->label->installEventFilter(this->label);
bool form1::eventFilter(QObject *watched,QEvent *event)
{
if(watched == this->label && event->type() == QEvent::Paint)
{
labelPaint();
}
//交由QWidget的事件过滤器处理
return QWidget::eventFilter(watched,event);
}
void form1::labelPaint()
{
QPainter painter(this->label);
painter.setPen(Qt::blue);
painter.drawEllipse(30,15,50,65);
painter.drawLine(0,100,111,100);
}
窗体任何事件都会进入事件过滤器,从而进行控件的绘图工作,
因为是在控件上绘图,所以背景不会进行擦拭,保留背景颜色以及状态栏。
效果如图: