我正试图编写一个基于Qt的应用程序来显示和操作图像。
我想要图像始终展开为保持其纵横比的窗口大小。
不幸的是,QLabel没有选项来保持附加像素图的高宽比。
所以我写了一个自定义窗口小部件和实施resizeEvent()和的paintEvent()调整图像
,写生:如何像QLabel一样快速调整图像大小?
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函数,看看它是如何显示像素图的。
看来像素图曾经被转换为QImage并缩放到窗口大小
,然后再次转换为QPixmap。
我有点惊讶,因为QPixmap的QImage的和之间的转换是根据Qt的参考手册昂贵的操作
,但我想我的窗口小部件的改写的paintEvent()做同样的事情
作为QLabel ::的paintEvent()。然后,调整大小变得如预期慢得多。
我想知道为什么调整QLabel的速度如此之快。它是“隐式数据共享”的好处吗?
当然,因为私人数据
(如“d指针”)无法访问,所以将QLabel的paintEvent()复制到我的类是不可能的。
任何帮助,将不胜感激。