Вырезать QGLWidget?

Можно ли вырезать QGLWidget? Я имею в виду, я хотел бы сократить его, чтобы я получил доступ к графическому интерфейсу ниже. Звучит странно, но для меня было бы много работы, чтобы разделить мой QGLWidget на две части. Я надеюсь, вы понимаете, о чем я. Спасибо

1 ответ

Решение

Я не совсем понимаю, что вы имеете в виду под "вырезать" и GUI ниже. В Qt с правильно используемыми механизмами компоновки виджет потребляет область, которую он покрывает, и под ним нет виджетов.

Вы хотите визуализировать несколько представлений в одном QGLWidget? Это легко достигается при правильном использовании glViewport + glScissor.


РЕДАКТИРОВАТЬ из-за комментария

Есть два вида окон:

  • Верхний уровень (те, которые вы можете свободно перемещаться по экрану)
  • Дочерние окна (подокна, такие как виджеты или панели в окне верхнего уровня)

Дочерние окна снова имеют две характеристики:

  • логичный ребенок
  • настоящий ребенок

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

Реальное дочернее окно управляется операционной / графической системой. Такие реальные дочерние окна могут делиться своим графическим контекстом со своими родителями и братьями и сестрами. Однако OpenGL хорошо работает только в том случае, если окно, в котором создается контекст OpenGL, имеет свой собственный графический контекст. Таким образом, любое дочернее окно OpenGL неизбежно будет иметь свой собственный графический контекст и объект окна графической системы. Большинство графических систем не поддерживают надлежащим образом применение фигур к дочерним окнам (только для окон верхнего уровня, и это также конфликтует с OpenGL).

Таким образом, все сводится к тому, что практически невозможно и нежелательно пытаться "наложить" окно OpenGL поверх родного брата. Это может работать в некоторых обстоятельствах, но в большинстве случаев это не так.

Это плохие новости.

Хорошей новостью является то, что вы просто смотрели в несколько неверном направлении. Настоящим я направляю ваш взгляд на QGraphicsView. QGraphicsView поддерживает OpenGL в качестве бэкэнда, вы также можете написать свой собственный код рендеринга OpenGL, который будет выполняться в QGraphicsView. Но, кроме того, QGraphicsView также можно использовать для рендеринга виджетов, также используя OpenGL. Поэтому все, что вам нужно сделать, это поместить код рендеринга OpenGL и ваш виджет в общую сцену QGraphicsView, и все готово. А вот учебник http://www.crossplatform.ru/node/612 результат учебника выглядит так:

Другие вопросы по тегам