Qt 拖动窗口图片缩放

自己封装了一个widget  重写了事件,并在里面放了label

#ifndef WIDGETRESZIMG_H
#define WIDGETRESZIMG_H

#include <QHBoxLayout>
#include <QLabel>
#include <QWidget>

#include <core/mat.hpp>

class WidgetReszImg : public QWidget
{
  Q_OBJECT
public:

  explicit WidgetReszImg(QWidget *parent = nullptr);
  void setImg(cv::Mat img);
protected:
  void resizeEvent(QResizeEvent *event);
private:
  QLabel* image_label = new QLabel(this);

};

#endif // WIDGETRESZIMG_H
#include "WidgetReszimg.h"

#include <QHBoxLayout>
#include <QImageReader>
#include"opencv.hpp"
WidgetReszImg::WidgetReszImg(QWidget *parent) : QWidget(parent)
{
  setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
  image_label->setBackgroundRole(QPalette::Base);
  image_label->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
  image_label->setScaledContents(true);//使图片能缩放铺满整个label
}

//这个把参数可以自行改成QImage,不用opencv
void WidgetReszImg::setImg(cv::Mat img)
{
  QImage image;
  image = QImage(reinterpret_cast<unsigned char*>(img.data),
                 img.cols,
                 img.rows,
                 static_cast<int>(img.step),
                 QImage::Format_Grayscale8).copy();
  image_label->setPixmap(QPixmap::fromImage(image));
}

void WidgetReszImg::resizeEvent(QResizeEvent *event)
{
   //保持纵横比,我的宽高比是 2592/2048,可以去掉
  float scale = std::min( (float)width()/2592.0,(float)height()/2048.0);
  image_label->resize(floor(2592*scale),floor(2048.0*scale));

}

调用该类

1.拖一个layout布局,layout用来存放自定义widget

2. 使用add widget 将自定义的类添加到UI上

3.使用setimg 添加图像,如果需要刷新图像只需重新set

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "WidgetReszimg.h"
#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
  Q_OBJECT
public:
  MainWindow(QWidget *parent = nullptr);
  ~MainWindow();
private:
  Ui::MainWindow *ui;
  WidgetReszImg *widgetReszImg =new WidgetReszImg() ;

};
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
  : QMainWindow(parent)
  , ui(new Ui::MainWindow)
{
  ui->setupUi(this);
 
  //这里读图可以不用opencv,用qt的库读图,具体看我的另一篇博客
  cv::Mat frame = cv::imread("111.jpg");
  //setImg 显示的是灰度图,所以这里转换个色彩空间
  cvtColor(frame, frame, cv::COLOR_BGR2GRAY);
  widgetReszImg->setImg(frame);
  ui->verticalLayout_8->addWidget(widgetReszImg);
}

MainWindow::~MainWindow()
{
  delete ui;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值