Qt主窗口与QOpenGLWIdget在视网膜显示显示错误的大小
Qt MainWindow with QOpenGLWIdget in Retina display displays wrong size
我有一个Qt应用程序与MainWindow
。
我在其中嵌入了一个QOpenGLWidget
。一切都很好,直到我开始使用苹果视网膜显示器并在高DPI模式下运行我的应用程序:我的QOpenGLWidget
只是它应该有的大小的1/4(即,它只填充了它应该填充的区域的左下角)。这个小部件正在显示原始的OpenGL数据(实际上是一个OpenSceneGraph上下文)
我能做什么来解决这个问题?
发现现在最好的选择,对于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,因此对我来说这似乎是便携式的。
From Qt docs (section OsX),
注意:缩放不适用于Open GL窗口
我没有在Mac电脑上尝试这种方法,但它在我的Windows电脑上解决了同样的问题。我不确定这是否是最好的解决方案,不过,可能有更简单的解决方案。试着看看它是否有效。
主要思想是手动缩放您的OpenGL内容大小。
First,定义要执行的缩放量。您可以使用物理点每英寸的特性:
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
中使用scaleX
和scaleY
,并确保我们手动缩放:
- 大小如
QOpenGLWidget::width()
和QOpenGLWidget::height()
将变成this->width()*m_scaleX
和this->height()*m_scaleY
- 鼠标事件坐标,如
event->x()*m_scaleX
和event->y()*m_scaleY
- 显示错误输出的简单数组排序程序
- 我是 c++ 的新手.学习基本知识后,我想做井字游戏.对于印刷板,我在下面写代码,但它显示错误
- Clion显示错误,但可以使用Cmake成功构建代码
- 代码使用向量成功运行,但使用数组显示错误
- SDL 映像:无法打开映像,仅显示错误消息
- 为什么将指针重新分配给 1D 数组的 char 时显示错误,但 2D 数组工作正常?
- 与clang++一起使用的VS代码在构建良好的C++文件中显示错误
- 编译器没有显示错误,但我没有得到任何输出.怎么了?
- PPM 颜色显示错误
- 当我选择大于 720 的矩阵大小时,程序退出并显示错误代码.可能是什么原因?
- is_permutation方法从 #include<algorithm> 显示错误的输出
- 为什么使用与父级声明的 std::function 在与子级一起使用时会显示错误?
- 我的代码厨师提交显示错误的结果
- 显示错误"std_lib_facilities.h"
- 为什么C++显示错误的数字?
- Android (ART) 崩溃并显示错误 JNI 在应用程序中检测到错误:jstring 是无效的本地引用
- 这是我的 .h 文件的一些错误,当我在其中包含我的类模板时,它显示 [错误] 未终止 #ifndef
- c++ IF 语句执行,但添加 ELSE 会显示错误
- 内核.cpp在制作 kernel.o 时显示错误和 Makefile 错误
- C++代码编译,但在 Zorin OS 上运行时显示错误