Как увеличить и прокрутить QGLWidget

В проекте, где я использую 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();

на изображении ниже я прокручиваю изображение вниз, но отображаемое изображение не может быть выше высоты панели

введите описание изображения здесь

1

Решение

Вы не должны злоупотреблять glViewport для увеличения. Окно просмотра используется для установки того, какой части (видимого) окна NDC координаты отображаются после проекции. Обычно вы устанавливаете glViewport в размер окна, к которому вы рисуете.

Любое масштабирование и прокрутка должны выполняться путем настройки матрицы проекции, путем регулировки левого, правого, нижнего и верхнего пределов в зависимости от того, что должно быть показано.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]