В проекте, где я использую QGLWidget для создания собственного средства просмотра изображений, я пытаюсь добавить функцию масштабирования и прокрутки при отображении больших изображений, но у меня возникает проблема, когда изображение обрезается и не может быть шире, чем его исходный размер или размер панели ,
Здесь я настроил область просмотра и glScalef. При реализации прокрутки я создаю подкласс QAbstractScrollArea и передаю координаты полос прокрутки в переменную.
// scrollOffset has the coordinates of horizontal and vertical scrollbars
// this->width() and this->height() are panel size
glViewport(0 - scrollOffset.x(), 0 + scrollOffset.y(), this->width(), this->height());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, this->width(), this->height(), 0); // flip the y axis
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// if zoomFactor value is 1.0 means no zooming
glScalef(zoomFactor, zoomFactor, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
Рендеринг изображения:
glBindTexture( GL_TEXTURE_2D, texId );
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.width(), tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());
glBegin(GL_QUADS);
// text coords are flipped in y axis
// width and height are image's original size
glTexCoord2d(0,1); glVertex3d(0, 0, 0);
glTexCoord2d(1,1); glVertex3d(width, 0, 0);
glTexCoord2d(1,0); glVertex3d(width, height, 0);
glTexCoord2d(0,0); glVertex3d(0, height, 0);
glEnd();
на изображении ниже я прокручиваю изображение вниз, но отображаемое изображение не может быть выше высоты панели
Вы не должны злоупотреблять glViewport для увеличения. Окно просмотра используется для установки того, какой части (видимого) окна NDC координаты отображаются после проекции. Обычно вы устанавливаете glViewport в размер окна, к которому вы рисуете.
Любое масштабирование и прокрутка должны выполняться путем настройки матрицы проекции, путем регулировки левого, правого, нижнего и верхнего пределов в зависимости от того, что должно быть показано.
Других решений пока нет …