【问题标题】:Qt5 QLabel + QPixmap. Memory leak?Qt5 QLabel + QPixmap。内存泄漏?
【发布时间】: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

标签: windows qt memory


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多