使用QPixmap作为渲染缓存时,保持正确的GUI缩放

时间:2016-07-31 12:16:58

标签: qt scale qpixmap

我使用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。

一台显示器上的一切正常。

enter image description here

但是,当我有多个不同缩放的屏幕时,结果会有所不同。直接绘制正确适应并以当前屏幕分辨率呈现。像素图始终以主屏幕分辨率呈现。

辅助屏幕上的窗口,缩放率为150%,主屏幕缩放比例为100%:

enter image description here

到目前为止,这是可以理解的。 Pixmap不了解屏幕,因此它使用主屏幕的缩放是合理的。我现在的问题是:

有没有办法调整像素图渲染的缩放?

我觉得我应该修改Pixmap的logicalDpiX/Y。但是,从Qt 5.6.1开始,这似乎是不可能的。

1 个答案:

答案 0 :(得分:1)

可能的解决方法是重新缩放字体大小而不是Person。至少这似乎适用于字体。不确定是否还需要修改其他画家设置,如线宽。

logicalDpiY

如上所述:辅助屏幕上的窗口具有150%缩放,主屏幕具有100%缩放:

enter image description here

注意:使用以下代码更新了github repo:https://github.com/the-yeti/qpixmap-scaling-demo