C++ 使用QImage、QPixmap和QLabel绘制
我使用以下代码在Qt中绘制像素C++ 使用QImage、QPixmap和QLabel绘制,c++,qt,C++,Qt,我使用以下代码在Qt中绘制像素 #include "mylabel.h" #include "cmath" #include "QMouseEvent" #include "iostream" MyLabel::MyLabel(QWidget *parent, Qt::WindowFlags f):QLabel(parent,f){ disabled=false; centerset=false; size_x=600; size_y=600; this-
#include "mylabel.h"
#include "cmath"
#include "QMouseEvent"
#include "iostream"
MyLabel::MyLabel(QWidget *parent, Qt::WindowFlags f):QLabel(parent,f){
disabled=false;
centerset=false;
size_x=600;
size_y=600;
this->img =NULL;
this->pxmap=NULL;
}
MyLabel::MyLabel(const QString &text, QWidget *parent, Qt::WindowFlags f):QLabel(text,parent,f)
{
}
MyLabel::~MyLabel()
{
delete(pxmap);
delete(img);
}
QImage *tempimg;
QPixmap *temppx;
void MyLabel::mousePressEvent(QMouseEvent *ev){
if(disabled){
return;
}
if(centerset==false)
{
a=ev->pos().x();
b=ev->pos().y();
centerset= true;
return;
}
tempimg = this->img;
if(tempimg!=NULL)
{
clear();
delete img;
}
this->img = new QImage(size_x, size_y, QImage::Format_RGB888);
int x1,x2,y1,y2;
int x3=ev->pos().x();
int y3=ev->pos().y();
x3=x3-a;
x3=x3*x3;
y3=y3-b;
y3=y3*y3;
r = x3+y3;
r=sqrt(r);
int x=0;
int y=r;
int d=(3-2*r);
while(x<=y)
{
if(d<=0)
d += (4*x+6);
else
{
d = d+4*(x-y)+10;
y--;
}
x++;
img->setPixel(a+x,b+y,qRgb(0,255,255));
img->setPixel(a-x,b+y,qRgb(0,255,255));
img->setPixel(a+x,b-y,qRgb(0,255,255));
img->setPixel(a-x,b-y,qRgb(0,255,255));
img->setPixel(a+y,b+x,qRgb(0,255,255));
img->setPixel(a-y,b+x,qRgb(0,255,255));
img->setPixel(a+y,b-x,qRgb(0,255,255));
img->setPixel(a-y,b-x,qRgb(0,255,255));
}
this->pxmap = new QPixmap();
pxmap->convertFromImage(*this->img);
this->setPixmap(QPixmap::fromImage(*img));
}
此代码可以在执行过程中多次运行。问题是
当代码第二次运行时,旧像素仍然显示
如果我去掉这些线
if(tempimg!=NULL)
{
clear();
delete img;
}
然后代码就可以完美地运行了。不显示旧像素,只显示由最新函数调用绘制的像素。
如果我不删除它会有内存泄漏,对吗?
请帮助我。此处不需要新建和删除。QPixmap和QImage经过优化,您可以将它们用作它们使用的写时拷贝模式的值,因此通常创建浅拷贝。因为您没有提供足够的信息,所以不能再说什么了。您的意思是我不必删除这些对象吗?您的代码是否从QWidget::paintEvent运行?不,不必。它从鼠标单击事件运行。当我尝试使用按钮clickshow时也会发生同样的事情更多的代码,更多的上下文!就像我写的,没有足够的数据来说明问题所在。是的,您不必为QImage和QPixmap使用指针,因此可以省略delete和new,所有内存魔法都发生在下面,所以您不必担心这一点。
if(tempimg!=NULL)
{
clear();
delete img;
}