У меня есть QMainWindow, содержащее два QGLWidgets. Виджеты используют конструктор по умолчанию и не разделяют контекст. Оба виджета отображают двухмерные данные и позволяют перетаскивать их.
Это работает с использованием 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, совпадают с данными виджета, с которым вы взаимодействуете. В идеале вы создаете их копии во время рисования в некоторую переменную-член класса виджета.
Других решений пока нет …