我有一个包含两个QGLWidget的QMainWindow。小部件使用默认的构造函数,并且不共享上下文。小部件既显示二维数据,又允许单击和拖动。
这使用gluUnproject工作,并且在创建的第一个QGLWidget上工作良好。当点击第二个小部件时,一切都如预期的那样工作。然而,当拖动第二个小部件时,移动并不平滑。更糟糕的是,一旦拖动了第二个小部件,第一个小部件的gluUnproject就会按一定的幅度关闭,这似乎与拖动第二个显示器的方向和距离有关。
我尝试过在绘图方法开始时、鼠标事件开始时调用makeCurrent(),以及其中一个、另一个和两者的组合,但没有看到任何改进。
void MyGLWidget::paintEvent(QPaintEvent *event){
glViewport(0, 0, widgetWidth, widgetHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90,(GLfloat)((widgetWidth/widgetHeight)),0.1f,-zoomMin);
glTranslatef(camera.x, camera.y, camera.zoom);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//[GL Drawing code]
glGetDoublev( GL_MODELVIEW_MATRIX, _modelview );
glGetDoublev( GL_PROJECTION_MATRIX, _projection );
glGetIntegerv( GL_VIEWPORT, _viewport );
}
确保传递给gluUnProject的视口和矩阵数据与正在交互的小部件的数据匹配。理想情况下,您可以在绘图时将它们的副本创建到某个小部件类成员变量中。