Qt MainWindow与Retina显示屏中的QOpenGLWIdget显示错误的大小

时间:2016-09-12 17:16:55

标签: c++ macos qt opengl

我有一个MainWindow的Qt应用程序。

我在其中嵌入了QOpenGLWidget。一切正常,直到我开始使用Apple Retina显示器并以高DPI模式运行我的应用程序:我的QOpenGLWidget只是它应该具有的大小的1/4(即,它只填充左下角部分它应该填补的区域)。这个小部件显示原始OpenGL数据(实际上是一个OpenSceneGraph上下文)

我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:4)

发现,对于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

}

在Retina / HighDPI显示器中以低分辨率模式运行时,或在常规显示器中运行时,此比率为1,因此对我来说这似乎是可移植的。

答案 1 :(得分:2)

来自Qt docs(OsX部分),

  

注意:缩放不适用于Open GL窗口

我没有在Mac上尝试这种方法,但它在我的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*可以判断一英寸的像素数。为了定义比例,检测密度的参考值,然后按比例与物理设备的密度成比例(下一步)。

第二次,您必须使用scaleX内的scaleYQOpenGLWidget,并确保我们手动缩放:

  • QOpenGLWidget::width()QOpenGLWidget::height()等尺寸将变为this->width()*m_scaleXthis->height()*m_scaleY
  • 鼠标事件坐标,例如event->x()*m_scaleXevent->y()*m_scaleY