[QT]实现点击按钮弹出图片的效果
点击按钮弹出图片的实现
void MainWindow::btnTest()
{
QLabel* labelImage = new QLabel(this, Qt::Dialog |Qt::WindowCloseButtonHint); /* 去掉?按钮 */
labelImage->setWindowTitle("图片");
QString imagePath = "B:\\Image\\JPG\\3.jpg";
QFileInfo file(imagePath);
if(file.exists())
{
QImage image;
image.load(imagePath);
/* 下面这两句代码是Label跟随图片大小变化 */
//ret->resize(QSize(image.width(), image.height()));
//ret->setPixmap(QPixmap::fromImage(image));
/* 这两句是图片跟随label大小变化 */
labelImage->resize(300,300);
labelImage->setPixmap(QPixmap::fromImage(image.scaled(300, 300, Qt::KeepAspectRatio)));
}
else{
qDebug() << "未找到该图片";
}
labelImage->show();
}
效果
--------------------------------------------------------分割线----------------------------------------------------------
修改:(20220628)
上述程序中labelImage
作为一个指针,在关闭时并没有释放,当打开关闭很多次时,内存泄漏现象就很明显,现修改程序如下:
1. 将指针定义在函数外部,在头文件中定义QLabel* labelImage;
2. 按钮槽函数将->
改为.
,并且为labelImage
安装事件过滤器,在程序中捕获labelImage
的关闭事件,从而销毁指针;
按钮槽函数修改如下:
void MainWindow::on_pushButton_clicked()
{
QString imagePath = "D:\\AccountFile\\Desk\\build-Test-Desktop_Qt_5_13_0_MSVC2017_64bit-Debug\\debug\\Drunk_Kobayashi_Python.png";
QFileInfo file(imagePath);
if(!file.exists()) return;
QImage image;
image.load(imagePath);
if(image.isNull()) return;
labelImage = new QLabel(this, Qt::Dialog |Qt::WindowCloseButtonHint); /* 去掉?按钮 */
labelImage->setWindowTitle("图片");
labelImage->installEventFilter(this);
/* 下面这两句代码是Label跟随图片大小变化 */
//ret->resize(QSize(image.width(), image.height()));
//ret->setPixmap(QPixmap::fromImage(image));
/* 这两句是图片跟随label大小变化 */
labelImage->resize(300,300);
labelImage->setPixmap(QPixmap::fromImage(image.scaled(300, 300, Qt::KeepAspectRatio)));
labelImage->show();
}
- 在头文件中定义事件过滤器
protected:
bool eventFilter(QObject *obj, QEvent *event) override;
在源文件中声明如下:
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if(obj == labelImage)
{
if(event->type() == QEvent::Close)
{
labelImage->removeEventFilter(this);
qDebug() << "delete";
labelImage->deleteLater();
labelImage = nullptr;
}
}
return QMainWindow::eventFilter(obj, event); /* 将事件传递给父类 */
}
-
验证程序
打开任务管理器。可以看到Test.exe
所占内存为6.5MB
,点击打开图片后所占内存为7.1MB
,点击x
关闭窗口,可以看到内存又变为6.5MB
。
打开前
打开后