我有一个奇怪的问题,我想这是由qt引起的。我使用的是qt OpenGL小部件和重绘例程,MouseMove事件如下所示:
void RenderGraphFrame::redraw()
{
GLdouble objX, objY, objZ;
GLdouble ModelViewMatrixvector[16], ProjectionViewMatrixVector[16];
GLint ViewportVector[4];
glGetIntegerv (GL_VIEWPORT, ViewportVector);
glGetDoublev (GL_MODELVIEW_MATRIX, ModelViewMatrixvector);
glGetDoublev (GL_PROJECTION_MATRIX, ProjectionViewMatrixVector);
gluUnProject(mousepositionX, mousepositionY, 0,
ModelViewMatrixvector,
ProjectionViewMatrixVector,
ViewportVector,
&objX, &objY, &objZ);
qDebug() << "objX: " << objX << " objY: " << objY << " objZ: " << objZ;
qglColor(Qt::red);
glBegin(GL_TRIANGLES);
glNormal3f(0,-1,0.707);
glVertex3f(objX-1,objY-1,0);
glVertex3f(objX+1,objY-1,0);
glVertex3f(objX,objY,1.2);
glEnd();
}
void RenderGraphFrame::mouseMoveEvent (QMouseEvent *event)
{
mousepositionX = event->x();
mousepositionY = event->y();
redraw();
return;
}当我将鼠标移到小部件上时,我通过qDebug()获得了整个输出流,因此肯定执行了偶数触发器和redraw()。
为了进行测试,我想要呈现一个由4个三角形组成的正方形,其中一个在光标后面。
但只有3种形状的第4种形状不见了.至少我是这么想的。当我在执行任务时,当我是alt+tabbing的时候,我发现当我按下alt-key时,redraw()方法会再次被调用,与上次鼠标移动的输出完全相同,但是现在第四个形状被呈现出来了(不是在我想要的位置上,但这很可能只是我的3D逻辑中的错误)。
这怎么可能呢?在导致这种情况的小部件中有什么神秘的东西吗?如果这不是我的错,我能做什么,qt让我做它想做的吗?
编辑:
-I注意到,只要按下alt-key以导致所需的呈现,就很难再现(在单击alt+tab菜单上的“不同”时,在其他应用程序中进行选项卡操作是很困难的)。但是,可复制的是:当我退出应用程序,然后再次插入时,重绘将按其应有的方式工作。但不是从mousemove事件中调用的。
-I删除了不存在问题的静态形状,因此代码更易于阅读。
发布于 2015-07-13 11:21:33
错误是假设OpenGL上下文在每个函数调用时处于相同的状态。然而,Qt在呈现自己的内容时修改了许多状态。这就是为什么每次在代码中执行完全相同的GL调用时,也会得到不同的结果。
引用Qt文档:
..。油漆引擎将更改当前OpenGL上下文的状态,以反映其需求。应用程序不应依赖于将OpenGL状态重置为其原始条件,特别是当前的着色器程序、OpenGL视图、纹理单元和绘图模式。
因此,在每次调用redraw()时,许多状态,如边界纹理、多边形模式、混合、深度测试等,基本上都处于随机状态。您必须在redraw()开始时重置它们,以确保每次都得到相同的结果。
发布于 2015-07-13 12:17:58
我通过在事件侦听器中更改redraw()对updateGL()的方法调用来修正这种行为。正如Lukas在他的回答中所描述的那样,这很可能与qt自己的行为有关。
现在正在运行的版本有这个方法的实现:
void RenderGraphFrame::mouseMoveEvent (QMouseEvent *event)
{
mousepositionX = event->x();
mousepositionY = event->y();
updateGL();
return;
}注意:updateGL()是一个外部函数!
https://stackoverflow.com/questions/31381405
复制相似问题