如何在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 项目的确切大小和位置?