[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();
}
  1. 在头文件中定义事件过滤器
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); /* 将事件传递给父类 */
}
  1. 验证程序
    打开任务管理器。可以看到Test.exe所占内存为6.5MB,点击打开图片后所占内存为7.1MB,点击x关闭窗口,可以看到内存又变为6.5MB
    打开前
    在这里插入图片描述

    打开后
    在这里插入图片描述

  • 3
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值