QT展示图片


Widget窗口只显示一张图片

QWidget* bigPic = new QWidget(this);
bigPic->setObjectName(QString("%1BIG").arg(m_imgPath));
bigPic->installEventFilter(this);
bigPic->setWindowFlags(windowFlags() & ~Qt::WindowMaximizeButtonHint);    // 禁止最大化按钮
QImage* pict = new QImage(m_imgPath);  // m_imgPath图片路径
int pict_H = pict->height();
int pict_W = pict->width();
bigPic->setFixedSize(pict_W, pict_H);                     // 禁止拖动窗口大小
// 设置背景图片
bigPic->setAutoFillBackground(true);    // 这句要加上, 否则可能显示不出背景图.
QPalette palette = this->palette();
palette.setBrush(QPalette::Window,
    QBrush(QPixmap(m_imgPath).scaled(    // 缩放背景图.
        bigPic->size(),
        Qt::IgnoreAspectRatio,
        Qt::SmoothTransformation)));    // 使用平滑的缩放方式
bigPic->setPalette(palette);
bigPic->show();
bigPic->setWindowTitle("图片详情");

Label里显示图片

在显示图片的时候,改变窗口大小,图片总会变得很奇怪,一气之下就把展示图片的Label单独做了个类,主要通过resizeEvent函数来动态调整图片大小,还有就是根据窗口大小对图片进行缩放

void ::resizeEvent(QResizeEvent* event)
{
    // 获取新的窗口大小
    QSize newSize = event->size();

    ui.widget->resize(newSize.width(),20);

    QImage pict(pictPath);
    int pict_H = pict.height();
    int pict_W = pict.width();
    float ratio_HW = float(pict_H) / float(pict_W);
    float ratio_WH = float(pict_W) / float(pict_H);
    if (pict_H >= pict_W && ratio_HW > 2) {
        pict_H = newSize.height();
        pict_W = newSize.width() / ratio_HW;
        ui.picLab->setGeometry(newSize.width() / 2 - pict_W / 2, 0, pict_W, pict_H);
        ui.picLab->setMinimumWidth(pict_W);
        ui.picLab->setMinimumHeight(pict_H);
    }
    else if (pict_H < pict_W && ratio_WH > 2) {
        pict_W = newSize.width();
        pict_H = newSize.height() / ratio_WH;
        ui.picLab->setGeometry(0, newSize.height() / 2 - pict_H / 2, pict_W, pict_H);
        ui.picLab->setMinimumWidth(pict_W);
        ui.picLab->setMinimumHeight(pict_H);
    }
    else {
        ui.picLab->setGeometry(0, 0, newSize.width(), newSize.height());
        ui.picLab->setMinimumWidth(newSize.width());
        ui.picLab->setMinimumHeight(newSize.height());
    }

    // 设置QLabel的大小策略为自动调整大小
    ui.picLab->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    ui.picLab->setText("");

    ui.picLab->setFrameShape(QFrame::Box);
    ui.picLab->setScaledContents(true);
    // 设置QLabel的大小策略为自动调整大小
    ui.picLab->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    QPixmap pixmap = QPixmap::fromImage(pict);

    // 进行缩放和显示等操作
    QPixmap fitPixmap = pixmap.scaled(ui.picLab->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
    ui.picLab->setPixmap(fitPixmap);
    ui.picLab->setFrameShape(QFrame::NoFrame);
    QWidget::resizeEvent(event); // 调用基类的resizeEvent函数,确保正常处理事件
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值