首页 > 其他 > 详细

如何在Qt的 paintEvent之外进行绘制

时间:2015-01-15 23:27:17      阅读:1015      评论:0      收藏:0      [点我收藏+]

QPainter 默认只能在paintEvent中进行绘制

这在有些情况下会很不方便,有时候我们希望可以在任意地方直接进行绘制

 

为了实现这个目的,可以采用以下方法:

继承QWidget,通过子类提供直接绘制的方法,并将所有绘制保存到中间的QPixmap

最后在重载的paintEvent中将QPixmap复制显示:

#pragma once

#include <QtWidgets/QWidget>
#include <QPainter>
#include <QResizeEvent>

class PaintWidget: public QWidget
{
	Q_OBJECT
public:
	PaintWidget(QWidget * parent = 0, Qt::WindowFlags f = 0)
		:QWidget(parent, f)
	{
		mPixmap = new QPixmap(width(), height());
		mPainter = new QPainter(mPixmap);
	}

	~PaintWidget()
	{
		delete mPainter;
		delete mPixmap;
	}

	void resizeEvent(QResizeEvent *event)
	{
		if(event->size().width() > mPixmap->width() || event->size().height() > mPixmap->height())
		{
			QPixmap* pixmap = new QPixmap((std::max)(event->size().width(), mPixmap->width()), (std::max)(event->size().height(), mPixmap->height()));
			delete mPainter;
			mPainter = new QPainter(pixmap);
			mPainter->drawPixmap(0, 0, *mPixmap);
			delete mPixmap;
			mPixmap = pixmap;
		}
	}

	void paintEvent(QPaintEvent *event)
	{
		QPainter painter(this);
		painter.drawPixmap(0, 0, *mPixmap);
	}

	QPainter* getPainter()
	{
		return mPainter;
	}
private:
	QPixmap* mPixmap;
	QPainter* mPainter;
};

  使用说明:

       通过子类提供的getPainter()方法获取QPainter指针以便进行绘制,比如:

      paintWidget.getPainter()->drawLine(...);

      paintWidget.update() ;   //绘制之后记得通过paintWidget.update() 通知页面刷新

   

  附:代码中的resizeEvent是为了保证缓存的QPixmap始终比widget大,根据情况你可以直接初始化为所希望的大小

如何在Qt的 paintEvent之外进行绘制

原文:http://www.cnblogs.com/wiki3d/p/4227307.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!