使用QPixmap时Qt存在内存泄漏问题

3
我在这段代码中发现了一个奇怪的内存泄漏。该方法是连接到另一个线程中的方法的SLOT。它有两个功能:1. 更新文本框中的迭代次数,以便从另一个线程中找到相应的图像。2. 更新GUI上显示的图像为对应的迭代次数的图像。
它在10-30个迭代中工作得很好,但之后就会崩溃。通过任务管理器观察其内存使用情况,我可以看到它一开始是稳定的,然后每次迭代都会增加大约10%的RAM使用量。我该如何消除这个泄漏?
Transition::Transition(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Transition)

    {
    ui->setupUi(this);
    this->files = files;
    imageObject = new QImage();
    scene = new QGraphicsScene(this);
}

Transition::~Transition()
{
    delete ui;
    delete imageObject;
    delete scene;
}

所涉及的SLOT是:
void Transition::onCounterChanged(QString counter){
    ui->imageCounter->setText(counter);
    foldername = ui ->folderName->toPlainText();
    int m = counter.toInt();
    QString filename = files[m];
    imageObject->load(filename);
    image = QPixmap::fromImage(*imageObject);

    scene->clear();//THIS FIXES THE LEAK

    scene->addPixmap(image);
    ui->picDisplay->setScene(scene);
    ui->picDisplay->fitInView(image.rect(),Qt::IgnoreAspectRatio);
}

1
信号在哪里和多久发射一次? - Robert
2
能否提供一个最小可运行的示例来测试您的问题?这将非常有帮助。 - gmas80
1个回答

5
我认为您不仅要更新图像,而且要在场景中创建新的像素图元,方法如下:
void Transition::onCounterChanged(QString counter)
{
    [..]
    imageObject->load(filename);
    image = QPixmap::fromImage(*imageObject);
    scene->addPixmap(image); // <----- Adds new pixmap item to the scene
    [..]
}

因此,在10-30次迭代后,您的场景上会有10-30个Pixmap项。我认为,您应该使用QGraphicsPixmapItem::setPixmap()函数更新现有的QGraphicsPixmapItem,而不是在每次迭代中创建一个新的。


我该如何从设置 pixmap 到更新场景呢? - user3241316
2
我无法弄清如何在这种情况下使用QGraphicsPixMapItem,但是在scene->addPixmap(image);之前加上scene->clear();似乎可以解决问题。感谢您找到了泄漏。 - user3241316
@user3241316 请查看:https://qt.gitorious.org/qt/qt/source/a8b6d332a6639b5dd2f3ac938251b12b7e4ad406:src/gui/graphicsview/qgraphicsscene.cpp#L2732 在您的情况下,您做了多少不必要的事情!再看看这个:https://qt.gitorious.org/qt/qt/source/a8b6d332a6639b5dd2f3ac938251b12b7e4ad406:src/gui/graphicsview/qgraphicsscene.cpp#L3066 如您所见,该方法非常简单。那么为什么不像 vahancho 建议的那样在您的代码中只使用一个 QGraphicsPixmapItem,并在每次迭代中设置 pixmap?他给了您极其有用的建议! - Jablonski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接