最近在熟悉Qt關于界面的控制元件,其中繪圖這一塊用到QPixmap這個類,繪圖事件設定成每次update()后都會去重新繪制painter.drawPixmap(Qpoint(0,0), *pix)。其中的pix是指向一個初始化new出來的QPixmap物件。但是在后面的clear()槽函式及resize()事件處理中都會重新new一個新的pixmap去覆寫原來的指標,如果直接這么做感覺應該是會造成記憶體泄漏的啊。因為原始的new出來的pixmap的指標直接指向另一個空間,原有的空間無法得到釋放啊。如果頻繁操作clear操作是否會持續一直new新物件呢?具體代碼如下:
求大家幫助解惑啊。
頭檔案:
#ifndef DRAWWIDGET_H
#define DRAWWIDGET_H
#include <QWidget>
#include <QPixmap>
#include <QColor>
#include <QPoint>
#include <QMouseEvent>
#include <QPainter>
class Drawwidget : public QWidget
{
Q_OBJECT
public:
explicit Drawwidget(QWidget *parent = nullptr);
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
void resizeEvent(QResizeEvent *event);
signals:
public slots:
void setStyle(int);//設定風格
void setWidth(int);//設定寬度
void setColor(QColor);//設定顏色
void clear();//清慷訓面
private:
QPixmap *pix;
QPoint startpos;
QPoint endpos;
int style;
int weight;
QColor color;
};
#endif // DRAWWIDGET_H
源檔案:
#include "drawwidget.h"
Drawwidget::Drawwidget(QWidget *parent) : QWidget(parent)
{
setAutoFillBackground(true);//對表單背景色設定
setPalette(QPalette(Qt::white));
pix = new QPixmap(size());
pix->fill(Qt::white);
setMinimumSize(600, 400);//設定最小尺寸
}
void Drawwidget::setColor(QColor c)
{
color = c;
}
void Drawwidget::setStyle(int s)
{
style = s;
}
void Drawwidget::setWidth(int w)
{
weight = w;
}
void Drawwidget::mousePressEvent(QMouseEvent *event)
{
startpos = event->pos();
}
void Drawwidget::mouseMoveEvent(QMouseEvent *event)
{
QPainter *painter = new QPainter;
QPen pen;
pen.setStyle((Qt::PenStyle)style);
pen.setWidth(weight);
pen.setColor(color);
painter->begin(pix);
painter->setPen(pen);
//繪制直線
painter->drawLine(startpos, event->pos());
painter->end();
startpos = event->pos();
update();
}
void Drawwidget::paintEvent(QPaintEvent *event)//繪圖事件
{
QPainter p(this);
p.drawPixmap(QPoint(0,0), *pix);
}
void Drawwidget::resizeEvent(QResizeEvent *event)
{
if(height() > pix->height() || width() > pix->width())
{
QPixmap *newpix = new QPixmap(size());
newpix->fill(Qt::white);
QPainter p(newpix);
p.drawPixmap(QPoint(0, 0), *pix);
pix = newpix;
}
QWidget::resizeEvent(event);//完成其余作業
}
void Drawwidget::clear()
{
QPixmap *clearpix = new QPixmap(size());
clearpix->fill(Qt::white);
pix = clearpix;
update();
}
uj5u.com熱心網友回復:
參考:https://blog.csdn.net/taiyang1987912/article/details/29271549轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/121054.html
標籤:C++ 語言
上一篇:cout的時候fixed和setiosflags(ios::fixed) 有區別嗎
下一篇:關于QEMU的問題
