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