2016-07-31 2 views
0

QPixmap을 렌더링 캐시로 사용하고 있습니다. 스케일링 요인이 다른 여러 화면을 사용할 때 크기 문제가 발생합니다 (창에서 테스트).QPixmap을 렌더링 캐시로 사용할 때 올바른 GUI 크기 조정을 유지하십시오.

데모 용으로 작은 위젯을 작성했습니다. 그리기는 직접 또는 장치에 그린 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을 사용합니다.

모든 모니터가 제대로 작동합니다. I는 다른 스케일링 여러 화면을 때

enter image description here

그러나 결과가 다르다. 직접 그리기는 현재 화면 해상도에서 올바르게 적용되고 렌더링됩니다. 픽스맵은 항상 기본 화면 해상도로 렌더링됩니다. 100 % 스케일링과 150 % 스케일링, 메인 화면과 보조 화면에

창 :

enter image description here

지금까지 그 이해할 수있다. Pixmap은 화면에 대해 알지 못하므로 기본 화면의 크기 조정을 사용하는 것이 합리적입니다. 내 질문은 지금 :

픽스맵 렌더링의 배율을 조정하는 방법이 있습니까?

Pixmap의 logicalDpiX/Y을 수정해야한다고 생각합니다. 하지만 그것은 Qt 5.6.1에서 불가능한 것으로 보입니다.

답변

0

가능한 해결 방법은 logicalDpiY 대신 글꼴 크기를 재조정하는 것입니다. 적어도 이것은 글꼴에서 효과가있는 것 같습니다. 선폭과 같이 다른 화가 설정을 수정해야하는지 확실하지 않습니다.

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 % 배율로 메인 화면과 보조 화면 창 :

enter image description here

참고 갱신 코드와 github에의 REPO : https://github.com/the-yeti/qpixmap-scaling-demo