我有一个MainWindow
的Qt应用程序。
我在其中嵌入了QOpenGLWidget
。一切正常,直到我开始使用Apple Retina显示器并以高DPI模式运行我的应用程序:我的QOpenGLWidget
只是它应该具有的大小的1/4(即,它只填充左下角部分它应该填补的区域)。这个小部件显示原始OpenGL数据(实际上是一个OpenSceneGraph上下文)
我该怎么做才能解决这个问题?
答案 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
内的scaleY
和QOpenGLWidget
,并确保我们手动缩放:
QOpenGLWidget::width()
和QOpenGLWidget::height()
等尺寸将变为this->width()*m_scaleX
和this->height()*m_scaleY
event->x()*m_scaleX
和event->y()*m_scaleY