Qt 拖动窗口图片缩放

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

#ifndef WIDGETRESZIMG_H
#define WIDGETRESZIMG_H

#include 
#include 
#include 

#include 

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 
#include 
#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(img.data),
                 img.cols,
                 img.rows,
                 static_cast(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));

}

调用该类

Qt 拖动窗口图片缩放_第1张图片

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

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

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

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "WidgetReszimg.h"
#include 

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;
}

你可能感兴趣的:(qt,qt)