默认情况下,Qt使用一种非常简单、快速和丑陋的缩放图像的方法,Qt::FastTransformation
,可能是最近的邻居插值或非常类似的东西。
在处理QPixmap
时,人们可以选择视觉上更好的缩放,例如,
pixmap = pixmap.scaledToHeight(height, Qt::SmoothTransformation);
但是,如果图像不是在QPixmap
对象中,而只是一个按钮或其他小部件的背景,那么我们能做什么?
例如,下面是一种非常简单的方法,用于创建一个自动调整大小的、完全自定义的按钮,非常适合与布局和setStretch()
一起使用的独立于分辨率的应用程序。
ui->pushButton->setStyleSheet(
"QPushButton { border-image: url(:/img/button.png) 0 0 0 0 stretch stretch; }"
"QPushButton:checked { border-image: url(:/img/button_checked.png) 0 0 0 0 stretch stretch; }"
"QPushButton:pressed { border-image: url(:/img/button_pressed.png) 0 0 0 0 stretch stretch; }"
"QPushButton:checked:pressed { border-image: url(:/img/button_checked_pressed.png) 0 0 0 0 stretch stretch; }"
);
由于Qt样式表中的border-image
,所以我使用了缺额而不是background-image
。
如何使用样式表中使用的图像进行更平滑的缩放?
用像素映射实现相同的东西就不那么优雅了。我必须始终捕获调整大小的事件,重新计算所有小部件的新大小,并手动重新绘制它们。
编辑:
有趣的是,如果图像被放大,平滑的缩放就会与样式表一起工作,但是当图像缩小的时候就不行了。
在下面的示例中,在第一行中使用32*32图标,在第二行中使用大于2000*2000的统一网格。
发布于 2017-01-25 00:06:08
在内部,Qt使用QPainter
绘制样式,QPainter
在绘制缩放像素映射时使用双线性插值。当降尺度因子足够小时,从质量角度看,这有一个很大的缺点,例如,请参阅这个错误报告。为了获得最好的质量,背景源图像应该始终在目标大小的0.5,2.0倍以内。AFAICT没有一条容易的方法来摆脱这一限制。
https://stackoverflow.com/questions/41690482
复制相似问题