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