QT5.12中,Qt::KeepAspectRatio,Qt::SmoothTransformation等比缩放没有随label窗口缩放

在Qt 5.12中,Qt::KeepAspectRatio和 Qt::SmoothTransformation 是用于控制图像缩放行为的选项,但它们并不直接与窗口大小变化或控件大小变化自动关联。如果希望在窗口或控件大小改变时保持图像比例不变,并且缩放时保持平滑,你可能需要通过信号和槽机制来实现这些效果。

以下是一种可能的实现方式,假设你有一个 QLabel 来显示图像,并希望在其大小改变时保持图像比例和平滑缩放:


1.继承 QLabel 创建子类

创建一个新的类继承自 QLabel,可以在这个类中重写 resizeEvent 方法,以便在 QLabel 大小变化时捕获并处理这个事件。


   //mylabel.h

  #include <QLabel>


  class MyLabel : public QLabel {

      Q_OBJECT

  public:

      MyLabel(QWidget *parent = nullptr);

  protected:

      void resizeEvent(QResizeEvent *event) override;

   };


   //mylabel.cpp

  #include "mylabel.h"


  MyLabel::MyLabel(QWidget *parent) : QLabel(parent) {}


  void MyLabel::resizeEvent(QResizeEvent *event) {

      if (!pixmap())

          return;


      //获取当前 Label 的大小

      QSize sz = event->size();


      //缩放图像,并保持比例和平滑

      QPixmap scaledPixmap = pixmap()->scaled(sz, Qt::KeepAspectRatio,Qt::SmoothTransformation);


      //设置缩放后的图像到 Label 中

      setPixmap(scaledPixmap);

   }



2.在主窗口中使用MyLabel

在你的主窗口或者其他的 QWidget 中使用这个自定义的 MyLabel 类来显示图像,而不是直接使用 QLabel。


   //mainwindow.cpp (示例中的主窗口)

  #include "mainwindow.h"

  #include "mylabel.h"


  MainWindow::MainWindow(QWidget *parent)

      : QMainWindow(parent)

   {

      //创建 MyLabel 实例

      MyLabel *label = new MyLabel(this);


      //加载图像到Label

      QPixmap image(":/images/myimage.jpg"); //替换成你的图像路径

      label->setPixmap(image);


      //将 Label 放置到主窗口的布局中,或者直接设置为主窗口的中心部件

      setCentralWidget(label);

   }


通过这种方式,当主窗口或者包含 MyLabel 的父控件大小改变时,MyLabel 将捕获到 resizeEvent,在这个事件中重新计算并缩放图像,以保持比例和平滑。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容