我使用QPixmap作为渲染缓存。当使用具有不同缩放因子的多个屏幕时(在Windows上测试),这会导致缩放问题。
我已经编写了一个小小部件用于演示目的。绘图既可以直接完成,也可以在QPixmap上完成,然后在设备上绘制。 (在实际应用程序中,pixmap被缓存以防止不必要的paint()调用。但为了简单起见,这里省略了)。如果有人想要完整的例子:https://github.com/the-yeti/qpixmap-scaling-demo
void RenderWidget::paintEvent(QPaintEvent *event)
{
if (m_usePixmap) {
QPixmap pm(width(), height());
paint(&pm);
QPainter(this).drawPixmap(0, 0, pm);
} else {
paint(this);
}
}
void RenderWidget::paint(QPaintDevice *pd)
{
QPainter p(pd);
p.fillRect(0, 0, pd->width(), pd->height(), QColor(192, 192, 192));
QFontMetrics fm = p.fontMetrics();
int h = fm.height();
for (int i=1; i<6; i++) {
p.drawLine(0, i*h, width(), i*h);
}
p.drawText(4, fm.ascent(), m_usePixmap ? "using QPixmap draw" : "using direct draw");
p.drawText(8, h+ fm.ascent(), QString("font pointsize: %1").arg(p.font().pointSize()));
p.drawText(8, 2*h + fm.ascent(), QString("font height: %1").arg(h));
p.drawText(8, 3*h + fm.ascent(), QString("physicalDpiY: %1").arg(pd->physicalDpiY()));
p.drawText(8, 4*h + fm.ascent(), QString("logicalDpiY: %1").arg(pd->logicalDpiY()));
}
为了演示,我已经并排放置了两个小部件实例。左边是直接绘制的,右边是使用QPixmap。
一台显示器上的一切正常。
但是,当我有多个不同缩放的屏幕时,结果会有所不同。直接绘制正确适应并以当前屏幕分辨率呈现。像素图始终以主屏幕分辨率呈现。
辅助屏幕上的窗口,缩放率为150%,主屏幕缩放比例为100%:
到目前为止,这是可以理解的。 Pixmap不了解屏幕,因此它使用主屏幕的缩放是合理的。我现在的问题是:
有没有办法调整像素图渲染的缩放?
我觉得我应该修改Pixmap的logicalDpiX/Y
。但是,从Qt 5.6.1开始,这似乎是不可能的。
答案 0 :(得分:1)
可能的解决方法是重新缩放字体大小而不是Person
。至少这似乎适用于字体。不确定是否还需要修改其他画家设置,如线宽。
logicalDpiY
如上所述:辅助屏幕上的窗口具有150%缩放,主屏幕具有100%缩放:
注意:使用以下代码更新了github repo:https://github.com/the-yeti/qpixmap-scaling-demo