Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用QImage、QPixmap和QLabel绘制_C++_Qt - Fatal编程技术网

C++ 使用QImage、QPixmap和QLabel绘制

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-

我使用以下代码在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->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;
    }