如何在qt中获取视口大小

Posted

技术标签:

【中文标题】如何在qt中获取视口大小【英文标题】:How to get viewport size in qt 【发布时间】:2013-09-25 19:18:56 【问题描述】:

如何在 qt opengl 中获取视口的大小(以像素为单位)并将其转换为 Vec2f?我的着色器需要它。

我知道 getWindowSize()。

【问题讨论】:

可能是错误的,但也许值得调查:覆盖 resizeEvent 好吧,我的着色器中需要 Vec2f,我正在使用 glUniform2fv() 函数。当我执行 Vec2f castin 时,我收到一个错误,即找不到 Vec2f 标识符 我看到答案和 cmets 有点冲突。也许您应该编辑问题并说明您将在何处、何时以及如何使用包含视口大小的 Vec2f。另外,在 SO 问题中,一点代码总是好的,好的代码 sn-p 会讲一千多字的解释。 【参考方案1】:

与在任何其他框架中获取视口大小的方式相同... GLint vp [4]; glGetIntegerv (GL_VIEWPORT, vp); 请注意,这将返回一个包含 4 个参数的整数数组 - 与您将传递给 glViewport (...) 的参数相同。

编写好的软件时,您无需向 OpenGL 状态机询问此信息,可能是将视口大小保持为缓存的本地状态。但除此之外,这是了解视口大小的唯一方法。那是因为它与你的窗口大小无关,所以从 Qt 中知道你的窗口大小根本不会帮助你解决这个问题。

【讨论】:

【参考方案2】:

只需在 resizeGL 事件中使用 QWidget::width()QWidget::height() 即可获取窗口的大小并从中确定您的视口尺寸。 不要QGLWidget::resizeGL 处理程序中设置视口;您应该使用它来调整取决于屏幕尺寸且更改成本高昂的事物,例如用于后处理 FBO 的纹理。

【讨论】:

【参考方案3】:

您需要重新实现 resizeGL 方法以使其正确。有关详细信息,请参阅 documentation 和 example。你会这样写:

void resizeGL(int w, int h)

    ...
    Vec2f myVec2f((GLint)w, (GLint)h);
    ...

一旦你有了这样的宽度和高度,转换到 Vec2f 就足够简单了。基本上只是Vec2f(width, height) 构造。

如果您需要在调整大小事件的上下文之外获取它们,也可以使用QWidget::size()、或QWidget::width()QWidget::height()

【讨论】:

以上是关于如何在qt中获取视口大小的主要内容,如果未能解决你的问题,请参考以下文章

获取浏览器视口的宽度和高度,无论内容大小如何且不调整为 100%?

如何使 OpenGL 视口具有渲染到其中的 QML 项目的确切大小和位置?

Qt 中如何获取系统默认字体大小?

如何在 WordPress 中根据视口大小提供不同大小的图像?

Qt Coordinate System

在 Safari 的响应式设计模式中,如何将视口宽度设为特定的 px 大小?