Qt5 QLabel + QPixmap。内存泄漏?

Posted

技术标签:

【中文标题】Qt5 QLabel + QPixmap。内存泄漏?【英文标题】:Qt5 QLabel + QPixmap. Memory leak? 【发布时间】:2015-05-30 07:59:12 【问题描述】:

我正在编写一个打印图像的应用程序。 简而言之,我有一个带有文件名的 QListWidget,我有一个用于打印的 QLabel。

这里是初始化(如果很重要的话):

connect(ui->filesList, SIGNAL(itemClicked(QListWidgetItem*)), this,
        SLOT(onFilesListItemClicked(QListWidgetItem*)));

ui->contents->setAlignment(Qt::AlignCenter);

这里是代码:

void MainWindow::onFilesListItemClicked(QListWidgetItem* item) 
    ui->contents->clear();
    QString filename = item->text();

    if (filename.split('.')[1]  == "png") 
        QPixmap pixmap(skinfolderpath + "/" + filename);

        if ((pixmap.height() > ui->contents->height()) || (pixmap.width() > ui->contents->width())) 
            pixmap = pixmap.scaled(ui->contents->width(), ui->contents->height(),
                                   Qt::KeepAspectRatio, Qt::SmoothTransformation);
        

        ui->contents->setPixmap(pixmap);
    

问题是内存加起来没有被释放。例如,如果我点击一张图片,内存将被分配。然后我点击另一个,内存加起来而不释放上一张图片的空间。这会在使用应用程序的几分钟内导致大量内存使用,这绝对是我不想要的。 那么,有没有办法解决呢?它显然来自某个地方的“浮动”QPixmap,但我不知道如何删除它。

对于实现,我使用pixmap.scaled 而不是仅仅设置ui->contents->setScaledContents(true),因为在我的情况下它将保持纵横比,但在scaledContents 的情况下不会。 另外,我知道ui->contents->clear() 在这里没用,因为使用ui->contents->setPixmap 重新设置像素图会清除所有内容,但我仍然试图找到我缺少的东西。

【问题讨论】:

问题出在代码的其他地方。看起来好像您正在创建和泄漏QLabels。 ui->contents 很可能已泄露 - 您需要向我们展示一个重现此情况的最小示例。我也不明白打印与任何事情有什么关系,以及为什么要使用QLabel 进行打印。您的意思是说您使用QLabel显示图像? @KubaOber 好吧,除了那个代码,没有别的了。 QListWidget(在 .ui 中静态创建)有一个 itemClicked 信号绑定到上面的那个槽函数。还有一个 QLabel(也在 .ui 中静态创建)。没有更多关于这个问题和加载显示图像的过程的代码。是的,对不起,我的意思是显示不打印。 那是什么 Qt 版本?你用的是什么编译器?如果您自己编译了 Qt,我还需要查看您传递给 configure 的参数(它们将位于构建目录根目录中的一个点文件中)。我会尝试重现这个。如果您将所有内容放在一个文件中并且不使用 .ui 而是手动构建 ui,会有所帮助。这样,它将是一个独立的、独立的示例。 @KubaOber 我使用 Qt 5.4.1 32 位(与 Qt Creator 3.3.2 捆绑),作为编译器我使用 MinGW 4.9.1 32 位。如果你真的想要一个工作示例,here 是带有代码的 git 存储库。我正在谈论的部分是在src/mainwindow.cpp 函数中从第 98 行开始。代码现在很乱,在我解决问题后要重构。 @KubaOber 要使该应用程序正常工作,您只需要以下文件结构:rootdir/Skins/folders/images 其中 rootdir 是您使用菜单 Tools -> change osu! folder 指向的位置。 Folders 只是文件夹,images 只是 png 【参考方案1】:

问题出在 Qt::SmoothTransformation,我遇到了同样的问题,Qt::FastTransformation 解决了内存泄漏。

【讨论】:

以上是关于Qt5 QLabel + QPixmap。内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

使用 QPixmap 创建 QLabel 的一个班轮

QLabel 上的 QPixmap 无法正确显示

从 QLabel 获取 QPixmap

混淆QLabel和QPixmap

如何使用保持纵横比的 QHBLayout 调整子 QLabel(具有 QPixmap)的大小?

我怎样才能让 QLabel 与它显示的 QPixmap 的大小完全一致?