2016-09-12 2 views
0

Qt 애플리케이션에 MainWindow이 있습니다.Retina 디스플레이의 QOpenGLWIdget이 포함 된 Qt MainWindow는 잘못된 크기를 표시합니다.

여기에 QOpenGLWidget을 삽입합니다. Apple Retina Display를 사용하고 고화질 DPI 모드로 앱을 실행하기 전까지는 모든 것이 잘 작동합니다. QOpenGLWidget은 예상했던 크기의 1/4에 불과합니다 (즉, 영역의 왼쪽 하단 부분 만 채 웁니다. 채우기로되어있다.) 이 위젯은 원시 OpenGL 데이터 (실제로는 OpenSceneGraph 컨텍스트)를 표시합니다.

이 문제를 해결하려면 어떻게해야합니까? Qt docs (섹션 OSX)에서

+0

크기의 1/4은 무엇을 의미합니까? 위젯이 지정된 영역을 채우지 못하거나 GL 뷰의 컨텐츠가 위젯 영역을 채우지 않는다는 뜻입니까? 위젯에 무엇을 표시하고 있습니까? 원시 OpenGL? 어쩌면 스크린 샷으로 설명 할 수 있습니다. – ypnos

+0

@ypnos가 질문에 답변했습니다. 감사! :) – manatttta

+0

나는 이해한다.그런 다음 귀하는 귀하의 질문에 대한 정답을 제시하고있는 반면, vicrucann은 올바른 문제를 암시합니다. 나는 너 자신의 대답을 받아 들일 것을 제안한다. – ypnos

답변

2

,

참고 : 스케일링은 내가 Mac에서이 방법을 시도하지 않았다

GL 창을 열기 적용되지 않습니다,하지만 같은 도왔다 내 Windows 컴퓨터에서 문제가 발생했습니다. 나는 그것이 최선의 해결책인지 확실하지 않지만, 더 쉬울 수도있다. 시도해보고 작동하는지 확인하십시오.

주요 아이디어는 OpenGL 콘텐츠 크기를 수동으로 조정하는 것입니다.

처음으로, 수행 할 스케일의 크기를 정의하십시오. 당신은 인치 당 물리적 점의 특성을 사용할 수 있습니다

QApplication app(argc, argv);  
int x = QApplication::desktop()->physicalDpiX(); 
int y = QApplication::desktop()->physicalDpiY(); 
// values 284 and 285 are the examples of reference values that we determined when DPI scaling was disabled 
double scaleX = 284.0/double(x); 
double scaleY = 285.0/double(y); 

physicalDpi* 우리가 인치에 대해 얼마나 많은 픽셀 판정 할 수 있습니다. 눈금을 정의하려면 밀도의 기준값이 얼마인지 감지 한 다음 물리적 장치의 밀도에 비례하여 비율을 조정하십시오 (다음 단계). 같은 QOpenGLWidget::width()QOpenGLWidget::height()

  • 크기 this->width()*m_scaleX로 설정하고 this->height()*m_scaleY
  • 마우스 이벤트의 좌표됩니다

    둘째, 당신은 QOpenGLWidget 내부의 scaleXscaleY를 사용하고 있는지 우리가 수동으로 확장 할 수 있도록해야 예 : event->x()*m_scaleXevent->y()*m_scaleY

+0

감사합니다. 당신의 대답을 기반으로, 저는'devicePixelRatio'를 발견 할 수있었습니다. 나는 그것이 내가 원하는 것을 직접적으로한다고 생각합니다. – manatttta

+0

도움이 되니 기쁩니다. 'devicePixelRation'은 정말로 더 깔끔하게 보인다. 나는 수동으로 계산 된 'scaleX'와'scaleY'가 약간 더 정확할 것이라고 생각합니다. 내 컴퓨터의 경우 2.0 및 2.02였습니다. 'devicePixelRation'은 두 차원 모두 2.0 값을 제공합니다. 차이점을 어떻게 인식 할 수 있는지 모르지만 두 옵션을 모두 사용하는 것이 좋습니다. – vicrucann

3

는 지금 최선의 방법은, OpenGL을 관련 위젯과 이벤트, 사용하는 것을 찾은 QPaintDevice::devicePixelRatio() (http://doc.qt.io/qt-5/qpaintdevice.html#devicePixelRatio)

이 이벤트의 크기를 조정, 즉 픽셀 좌표를 사용하는 모든, 마우스 이벤트를 곱 의미 등 . 예 :

void MyGLWidget::resizeGL(int width, int height) { 
    width *= Application::desktop()->devicePixelRatio(); 
    height *= Application::desktop()->devicePixelRatio(); 

    ... 
    // Continue with previous code 

} 

일반 디스플레이에서 실행할 때 망막/HighDPI 디스플레이에 낮은 해상도 모드에서 실행하거나,이 비율이 1, 그래서 이것은 나에게 휴대용 보인다.

관련 문제