Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 使用QPixmap作为渲染缓存时,保持正确的GUI缩放_Qt_Scale_Qpixmap - Fatal编程技术网

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

Qt 使用QPixmap作为渲染缓存时,保持正确的GUI缩放,qt,scale,qpixmap,Qt,Scale,Qpixmap,我使用QPixmap作为渲染缓存。当使用具有不同缩放因子的多个屏幕(在windows上测试)时,会导致缩放问题 我编写了一个小部件用于演示。可以直接绘制,也可以在QPixmap上绘制,然后在设备上绘制。(在实际的应用程序中,pixmap被缓存以防止不必要的paint()调用。但为了简单起见,这里没有提到这一点)。如果有人想要完整的示例: void RenderWidget::paintEvent(QPaintEvent*event) { 如果(m_usePixmap){ QPixmap pm(宽

我使用QPixmap作为渲染缓存。当使用具有不同缩放因子的多个屏幕(在windows上测试)时,会导致缩放问题

我编写了一个小部件用于演示。可以直接绘制,也可以在QPixmap上绘制,然后在设备上绘制。(在实际的应用程序中,pixmap被缓存以防止不必要的paint()调用。但为了简单起见,这里没有提到这一点)。如果有人想要完整的示例:

void RenderWidget::paintEvent(QPaintEvent*event)
{
如果(m_usePixmap){
QPixmap pm(宽度(),高度());
油漆和粉末冶金;
QPainter(this).drawPixmap(0,0,pm);
}否则{
油漆(这个);
}
}
void RenderWidget::paint(QPaint设备*pd)
{
油漆工p(pd);
p、 fillRect(0,0,pd->width(),pd->height(),QColor(192192192));
QFontMetrics fm=p.fontMetrics();
int h=调频高度();
for(int i=1;iphysicalDpiY());
p、 drawText(8,4*h+fm.ascent(),QString(“logicalDpiY:%1”).arg(pd->logicalDpiY());
}
为了演示,我将小部件的两个实例并排放置。左侧直接绘制,右侧使用QPixmap

在一台显示器上,所有这些都可以正常工作

然而,当我有多个具有不同缩放比例的屏幕时,结果会有所不同。direct draw可以正确地进行调整,并以当前屏幕分辨率进行渲染。pixmap始终以主屏幕分辨率渲染

次屏幕上的窗口具有150%的缩放比例,主屏幕具有100%的缩放比例:

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

是否有办法调整pixmap渲染的缩放比例?


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

一个可能的解决方法是重新缩放字体大小,而不是
逻辑字体。至少这似乎对字体有效。不确定是否还需要修改其他画师设置,如线宽

void RenderWidget::paint(QPaintDevice *pd)
{
    QPainter p(pd);

    if (m_usePixmap) {
        QWidget *w = this;  // widget on which the pixmap should be drawn later on

        if (pd->logicalDpiY() != w->logicalDpiY()) {
            // workaround the scaling by adapting the font
            QFont f(p.font());
            f.setPointSizeF((f.pointSizeF() * w->logicalDpiY()) / pd->logicalDpiY());
            p.setFont(f);
        }
    }

    p.fillRect(0, 0, pd->width(), pd->height(), QColor(192, 192, 192));

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

注意:使用以下代码更新了github回购协议:

void RenderWidget::paint(QPaintDevice *pd)
{
    QPainter p(pd);

    if (m_usePixmap) {
        QWidget *w = this;  // widget on which the pixmap should be drawn later on

        if (pd->logicalDpiY() != w->logicalDpiY()) {
            // workaround the scaling by adapting the font
            QFont f(p.font());
            f.setPointSizeF((f.pointSizeF() * w->logicalDpiY()) / pd->logicalDpiY());
            p.setFont(f);
        }
    }

    p.fillRect(0, 0, pd->width(), pd->height(), QColor(192, 192, 192));

    ...
}