【问题标题】:Qt MainWindow with QOpenGLWIdget in Retina display displays wrong size在 Retina 显示器中使用 QOpenGLWIdget 的 Qt MainWindow 显示错误的大小
【发布时间】:2017-01-20 04:44:38
【问题描述】:

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

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

我能做些什么来解决这个问题?

【问题讨论】:

  • 大小的1/4是什么意思?您的意思是小部件没有填充其指定区域还是 GL 视图中的内容没有填充小部件区域?你在小部件中显示什么?原始的OpenGL?也许你可以用截图来说明。
  • @ypnos 更改了问题来回答您。谢谢! :)
  • 我明白了。然后,您正在为您的问题提供正确的答案,而 vicrucann 也在暗示正确的问题。我建议你接受你自己的答案。

标签: c++ macos qt opengl


【解决方案1】:

发现对于 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,所以这对我来说似乎是便携的。

【讨论】:

    【解决方案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* 可以判断一英寸有多少像素。为了定义比例,检测密度的参考值是多少,然后根据物理设备的密度按比例缩放(下一步)。

    第二,您必须在QOpenGLWidget 中使用scaleXscaleY 并确保我们手动缩放:

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

    【讨论】:

    • 谢谢!根据您的回答,我找到了devicePixelRatio,我认为它可以直接满足我的需求
    • 很高兴它有帮助。 devicePixelRation 看起来确实更整洁。我认为手动计算的scaleXscaleY 会稍微精确一些。对于我的机器,它们是 2.0 和 ~2.02;而devicePixelRation 将为两个维度提供 2.0 的值。不确定差异有多大,但有两种选择很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    相关资源
    最近更新 更多