Qt4 如何像QLabel那样快速调整图像大小?

Qt4 如何像QLabel那样快速调整图像大小?,qt4,Qt4,我正在尝试编写一个基于Qt的应用程序,用于显示和处理图像。 我希望图像始终扩展到窗口大小,保持其纵横比。 不幸的是,QLabel没有选项来保持连接的pixmap的纵横比。 因此,我编写了一个自定义小部件,并实现了resizeEvent()和paintEvent()来调整图像的大小 然后画它: class MyLabel : public QWidget { Q_Object public: MyLabel(): pixmap("test.tif") {}

我正在尝试编写一个基于Qt的应用程序,用于显示和处理图像。
我希望图像始终扩展到窗口大小,保持其纵横比。
不幸的是,QLabel没有选项来保持连接的pixmap的纵横比。
因此,我编写了一个自定义小部件,并实现了resizeEvent()和paintEvent()来调整图像的大小
然后画它:

   class MyLabel : public QWidget
   {
     Q_Object

   public:
     MyLabel(): pixmap("test.tif") {} 

   protected:
     void resizeEvent(QResizeEvent *event)
     {
       pixmap_scaled = pixmap.scaled(size(), Qt::KeepAspectRatio);
     }

     void paintEvent(QPaintEvent *event)
     {
       QPainter p(this);
       p.drawPixmap(0, 0, pixmap_scaled);
       p.end();
     }

   private:
     QPixmap pixmap, pixmap_scaled;
   };  
但是图像的大小调整并不像QLabel那样平滑

然后,我查看QLabel.cpp中QLabel的paintEvent函数,以了解它如何显示pixmap。
在那里,pixmap似乎曾经被转换为QImage并缩放到窗口大小,
然后再次转换为QPixmap。
我有点惊讶,因为在QPixmap和QImage之间转换是一项昂贵的操作
根据Qt参考手册,但我尝试重写我的小部件的paintEvent()来做同样的事情
作为QLabel::paintEvent()。然后,调整大小变得比预期的慢得多

我想知道为什么QLabel的大小调整如此之快。这是“隐式数据共享”的好处吗?
当然,仅仅将QLabel的paintEvent()复制到我的类是不可能的,因为私有数据
例如“d指针”无法访问


任何帮助都将不胜感激。

来自QPixmap的详细描述:

QImage针对I/O、直接像素访问和操作进行了设计和优化,而QPixmap针对在屏幕上显示图像进行了设计和优化


因此,我想缩放QImage并将其转换回QPixmap要比缩放QPixmap快得多。这是一些可能有所帮助的一般观察结果

  • 如果您转换到QImage一次并保留对QImage的引用,那么可能会提高一些性能。然后,您只需要在绘制事件中缩放和转换回绘制
  • 在“调整大小”事件中,标记图像需要重新缩放,但在绘制之前不要这样做。Qt将在可能的情况下组合绘制事件,这样可以避免缩放,只是在绘制之前再次缩放
  • 如果您经常上下调整大小,请考虑查找“步骤”,并将缓存的图像保留在那里。如果可能,请显示这些步骤,如果不可能,请为当前大小选择一个缩放良好的步骤(通常是2的倍数)
  • 考虑不直接缩放图像,而是使用画师变换。这可能会将扩展工作从CPU转移到GPU转换,而GPU转换通常会更快。在这种情况下,您总是希望绘制全尺寸的图像,并让变换向上或向下进行