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
重新设置像素图会清除所有内容,但我仍然试图找到我缺少的东西。
【问题讨论】:
问题出在代码的其他地方。看起来好像您正在创建和泄漏QLabel
s。 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。内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章