paintEvent画图,如何才能够不擦拭背景

文章介绍了如何在QtC++中通过eventFilter函数代替paintEvent来避免窗体背景和状态栏被擦除的问题,实现控件上的定制绘图,保持背景和状态栏原样。
摘要由CSDN通过智能技术生成

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);
}

窗体任何事件都会进入事件过滤器,从而进行控件的绘图工作,
因为是在控件上绘图,所以背景不会进行擦拭,保留背景颜色以及状态栏。

效果如图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值