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