【发布时间】:2011-07-19 01:52:41
【问题描述】:
我正在尝试编写一个基于 Qt 的应用程序来显示和处理图像。
我希望图像始终扩展到保持其纵横比的窗口大小。
不幸的是,QLabel 没有选项来保持附加像素图的纵横比。
所以我写了一个自定义小部件并实现了 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函数,看看它是如何显示像素图的。
似乎像素图曾经转换为 QImage 并缩放到窗口大小,
然后再次转换为 QPixmap。
我有点惊讶,因为在 QPixmap 和 QImage 之间进行转换是一项昂贵的操作
根据 Qt 参考手册,但我尝试重写我的小部件的 paintEvent() 来做同样的事情
作为 QLabel::paintEvent()。然后调整大小变得比预期的要慢得多。
我想知道为什么 QLabel 的大小调整如此之快。是“隐式数据共享”的好处吗?
当然不可能将 QLabel 的paintEvent() 复制到我的班级,因为私有数据
例如“d 指针”无法访问。
任何帮助将不胜感激。
【问题讨论】:
标签: qt4