由于QGLWidget不能用于OpenGL / ES,我在Qt中留下了QWidget,以便小部件呈现opengl。 Reference
如果我在当前窗口中有渲染的以下renderView函数,我正在寻找将由Qt重复调用的“那个”函数,以便QWidget刷新屏幕,以便我可以通过重载调用该函数中的renderView。
任何想法如何做到这一点或常见的工作?
原始问题:我不想按照屏幕刷新率在1毫秒甚至16.66毫秒的计时器中调用renderView。
class MyWindow
{
void renderView()
{
if(DeviceContext && RenderingContext)
{
wglMakeCurrent(m_hdc, m_hrc); //Set current context
glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// glViewPort.... and render using shaders
SwapBuffers(m_hdc); // Double buffering thats why
}
}
};
class MyWidget : public QWidget, public MyWindow
{
// What is the function called repeatedly to refresh the screen
// so that i would ask that function to call renderView
};
提前致谢!
答案 0 :(得分:1)
由于QGLWidget不能用于OpenGL / ES
是的,我们需要在继续前进之前澄清一些混乱......
可以。这个小部件的发明是为了扩展通常的QWidget
界面与OpenGL桌面和嵌入式支持。请参阅以下示例,看看自己是否可以将此小部件用于OpenGL ES功能:
现在,我们可以回答您的问题。您应该重新实现的是以下受保护的方法。
void QGLWidget::paintGL() [virtual protected]
只要需要绘制窗口小部件,就会调用此虚函数。在子类中重新实现它。
在我们讨论它时,请同时检查受保护的初始化方法:
void QGLWidget::initializeGL() [virtual protected]
在第一次调用paintGL()或resizeGL()之前调用此虚函数,然后在为窗口小部件分配新的QGLContext时调用一次。在子类中重新实现它。
此函数应设置任何所需的OpenGL上下文渲染标志,定义显示列表等
事实上,您甚至可以按照以下受保护的方法处理此界面的叠加层:
void QGLWidget::paintOverlayGL() [virtual protected]
此虚函数的使用方式与paintGL()相同,不同之处在于它在窗口小部件的叠加上下文上操作,而不是在窗口小部件的主上下文中操作。这意味着只要需要绘制窗口小部件的叠加层,就会调用paintOverlayGL()。在子类中重新实现它。
和
void QGLWidget::initializeOverlayGL() [virtual protected]
此虚函数的使用方式与initializeGL()相同,不同之处在于它在窗口小部件的叠加上下文上操作,而不是在窗口小部件的主上下文中操作。这意味着在第一次调用paintOverlayGL()或resizeOverlayGL()之前调用initializeOverlayGL()一次。在子类中重新实现它。
此函数应设置任何所需的OpenGL上下文渲染标记,为叠加上下文定义显示列表等。