如何在Qt的 paintEvent之外進行繪制


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大,根據情況你可以直接初始化為所希望的大小


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM