【发布时间】: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