多个QGLWidgets和gluUnProject

时间:2013-02-05 15:38:23

标签: c++ qt opengl qglwidget

我有一个包含两个QGLWidgets的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 );
}

1 个答案:

答案 0 :(得分:0)

确保传递给gluUnProject的视口和矩阵数据与您正在交互的窗口小部件的视口和矩阵数据相匹配。理想情况下,您可以在绘制时创建它们的副本到一些窗口小部件类成员变量。