我正在尝试编写一个显示和操作图像的基于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函数,看看它是如何显示pixmap的。
似乎pixmap一旦被转换为QImage并缩放到窗口大小,
然后再转换为QPixmap
我有点惊讶,因为在QPixmap和QImage之间进行转换是一项昂贵的操作
根据Qt参考手册,但我尝试重写我的小部件的paintEvent()来做同样的事情
作为QLabel :: paintEvent()。然后调整大小变得比预期慢得多。
我想知道为什么调整QLabel的速度如此之快。这是“隐含数据共享”的好处吗?
当然,将QLabel的paintEvent()复制到我的类是不可能的,因为私有数据
例如“d指针”无法访问。
任何帮助都将不胜感激。
答案 0 :(得分:1)
可能有所帮助的一些一般性意见。
答案 1 :(得分:0)
来自QPixmap详细说明:
QImage专为I / O设计和优化,适用于直接像素访问和操作,而QPixmap专为在屏幕上显示图像而设计和优化。
所以我认为缩放QImage并将其转换回QPixmap比缩放QPixmap更快
答案 2 :(得分:0)
感谢您的回复。
但正如我上面所写,实现我的paintEvent()以缩放QImage并将其转换回QPixmap最终会导致更糟糕的性能。
所以我想在QLabel中使用了某种特殊的技术......