如何强制 QGLWidget 更新屏幕?

Posted

技术标签:

【中文标题】如何强制 QGLWidget 更新屏幕?【英文标题】:How to force QGLWidget to update screen? 【发布时间】:2013-02-21 12:15:47 【问题描述】:

我正在使用 Open GL 绘制一个简单的场景。我继承了 QGLWidget 并覆盖了paintGL()。没什么好看的:

void CGLWidget::paintGL()
 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    gluLookAt (120.0, 160.0, -300.0, 0.0 + 120.0, 0.0 + 160.0, 2.0 - 300.0, 0.0, 1.0, 0.0);
    glScalef(1.0f/300.0f, 1.0f/300.0f, 1.0f/300.0f);
    glClear(GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(80.0, width()/(double)height(), 5.0, 100000.0);

    glMatrixMode(GL_MODELVIEW);
    glBegin(GL_POINTS);
    glColor3f(1.0f,0.6f,0.0f);
    glVertex3d(x, y, z);

    // ...drawing some more points...

    glEnd();

 

我在主窗口中有一个计时器,它触发 GL 小部件的 updateGL()。我已经验证它会导致 paintGL() 被调用。但是,屏幕上的实际图片很少更新。即使我调整窗口大小,场景也不会更新。为什么会这样?如何强制更新?

【问题讨论】:

请问:为什么paintGL中两次初始化投影和MV矩阵?你在两者之间画了什么吗?如果没有,你用第二个矩阵覆盖第一个矩阵,你可以将此代码移动到resizeGL(投影)和initializeGL(模型视图) @leemes:不知道,实际上...这是一个错误,是我试图找到实际有效的投影和 MV 参数的残余。已修复,谢谢。 【参考方案1】:

不要从计时器调用 updateGL(),而是调用 update() 以确保视图获得绘制事件。

【讨论】:

它不起作用,paintGL() 根本不会被调用。也尝试调用两者 - 也不起作用。不过谢谢你的提示。 尝试在 QGLWidget::paintEvent 中设置一个断点,看看它在调用 update() 后是否到达那里,之后会发生什么。 只有在我调整窗口大小时才会调用。 您是否在视图的构造函数中设置了任何窗口标志?如果您让事件循环正确运行并且您没有禁用小部件上的更新,更新应该会导致您在调用它后不久的某个时间获得一个绘制事件。没有得到一个绘画事件是你的问题。 非常感谢,找到问题了!实际上只是我的一个逻辑问题,但你的回答有帮助:)【参考方案2】:

在你的 CGLWidget 构造函数中

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(10);

timer -> start(VALUE);

玩 `VALUE 10 只是一个例子。

装饰

【讨论】:

嘿,我用过这种技术,它行得通。是否有某种方式可以在渲染前一个场景后立即更新场景,因为现在我的计时器有 10 毫秒的瓶颈。我不能比这更快。 玩 `VALUE 10 只是一个例子。如果你把 1 放在那里,它会是 1ms,但是点不是,当你想刷新屏幕时,点是你的场景准备好.. 正是我所说的。一旦我的场景准备就绪,我希望触发更新。 然后确定你是否真的需要一个计时器。还有timer(0)会立即射出计时器 嗯,这就是我需要知道的,如何从应用程序本身中删除计时器。我宁愿不使用它。

以上是关于如何强制 QGLWidget 更新屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

QGLWidget 和快速的离屏渲染

Qt & OpenGL:如何强制使用 OpenGL 2.1?

QGLWidget 最大尺寸

QGLWidget 在 QT 中是如何工作的?

QGLWidget - 如何使用重绘构建程序

如何将 QWidget 添加到 QGLWidget