изменение размера QGLWidget для соответствия каждому размеру спрайта, который у меня есть

Я создаю редактор 2D-карт с помощью opengl для рисования простых спрайтов 32x32, но кажется, что я не могу изменить размер моего QGLWidget до большого размера (т.е. размер * размер спрайта -> 1024 * 32), использование 1024 работает нормально (используя glwidget -> установитьМинимальныйРазмер(...)). Я некоторое время гуглил об этом, единственная интересная вещь, которую я нашел, это подкласс QAbstractScrollArea и установка моего QGLWidget в качестве области просмотра (это то, что делает QGraphicsView), я также видел все примеры Qt opengl, но я не мог найти ничего, что может помочь (кроме примера Image Viewer, который не совсем то, что мне нужно), я также попробовал следующее: horizontalScrollBar()->setMaximum(width * 32); verticalScrollBar()->setMaximum(height * 32); с изменяемым размером виджета, установленным на true/false в области прокрутки, но все равно ничего. Есть идеи, как мне это сделать? Я могу показать больше кода, если вы попросите меня.

Использование Qt v4.7.3.


person Community    schedule 03.06.2012    source источник


Ответы (1)


У меня есть две идеи:

Если возможно, откажитесь от использования QGLWidget и поместите спрайты непосредственно в графическую сцену (QGraphicsPixmapItem). Возможно, это не то, что вам нужно, но графическая сцена предназначена для обработки большого количества элементов, поэтому большинство необходимых вам вещей (например, запуск событий мыши на элементах) уже реализованы.

Или просто поместите QGLWidget в графическую сцену с помощью QGraphicsWidget. Это должно автоматически сообщать сцене ее размер, который затем сообщает представление о размере сцены. Полосы прокрутки появляются автоматически, если сцена не помещается в поле зрения.

Обновление:

Как описано в этой ссылке, вы можете использовать OpenGL в любой графике. Посмотреть:

view.setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
view.setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
person leemes    schedule 03.06.2012
comment
спасибо за попытку помочь, но это не то, что мне нужно, я использовал это раньше, и это не пошло так, как нужно. Я столкнулся с проблемой производительности с QGraphicsView, низким FPS (около 20?) - person ; 04.06.2012
comment
Вы пытались настроить графический вид на использование OpenGL? Проверьте это: doc.qt.nokia.com/qq/ - person leemes; 04.06.2012
comment
Я мог бы попробовать это, но вопрос, не приведет ли это к тому же, что и в прошлый раз, когда я использовал QGraphicsView? (низкий FPS и т.д.?) - person ; 04.06.2012
comment
Предполагая, что низкий FPS был связан с тем, что он визуализировал сцену в программном обеспечении, рендеринг должен быть намного лучше с использованием QGLWidget для окна просмотра. Если вы не хотите реорганизовывать весь проект только для того, чтобы попробовать, вы можете провести простой тест и сравнить QGLWidget как область просмотра (аппаратное ускорение) с областью просмотра по умолчанию (программный рендеринг). - person leemes; 05.06.2012
comment
Спасибо, это на самом деле сработало хорошо, но я все еще иду тестировать FPS. Если у меня возникнут проблемы с этим, я открою новый вопрос. Я не хочу показаться глупым, но как вы думаете, использование openGL 2.0+, как описано в ссылке, будет отображаться быстрее, чем использование устаревшие функции из OpenGL 1.0? (Я понимаю, что новые вещи отличаются от старых, но я новичок в OpenGL). все еще читаю на 2-й странице на этом сайте - person ; 05.06.2012
comment
@Fallen Qt использует OpenGL за кулисами, чтобы рисовать то, что вы хотите нарисовать. Как это делается, не должно быть вашим делом, по крайней мере, при рисовании 2D-объектов. Так что не волнуйтесь, Qt делает все возможное, чтобы получить хорошую производительность. Насколько я знаю, Qt использует OpenGL 2.0 для рисования графической сцены, но я не уверен. Но я не думаю, что использование собственного движка рендеринга на основе OpenGL 3 (или чего-то подобного) делает его заметно быстрее. - person leemes; 05.06.2012
comment
Не удалось отредактировать мое предыдущее сообщение, переписав его снова, извините: да Qt использует opengl 2 (тестирование с помощью QPainter::paintEngine()::type() выводит Qt::OpenGL2). Я хочу использовать этот учебник для обучения и в качестве документации для использования при создании подклассов QGLWidget (я просто не хочу использовать QGraphicsScene для рендеринга за меня, потому что я пробовал это раньше, и я уверен, что это будет то же самое то, что я хочу сделать, это двигаться дальше и изучать новые вещи вместо того, чтобы застрять на автоматическом вызове-дро для меня) - person ; 05.06.2012
comment
Заглянув в QGraphicsWidet, примите ваш ответ. - person ; 06.06.2012