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