2011-12-30 35 views
5

Estoy tratando de implementar una escena OpenGL personalizada (envuelta en un QGLWidget), pero todavía uso controles QT (como barras deslizantes y botones). Intenté hacer de mi widget principal un QGLWidget, que tiene QWidgets como niños. Los widgets secundarios parecen funcionar (cuando hago clic en un menú desplegable, aparecen sus opciones), pero el widget no se dibuja (veo un cuadrado blanco). Cambié la clase base de los widgets de mis hijos de QWidget a QGLWidget, y ahora las llamadas a QPainter funcionan, pero las cosas de QT GUI aún no se muestran ...QGLWidget para gráficos y QT para GUI

Algunos afirman que un QGLWidget no puede tener QWidgets como niños ... I No estoy seguro de eso y no estoy dispuesto a darme por vencido. Por cierto, estoy usando Visualization Library para dibujar la escena OpenGL, pero es solo un contenedor OpenGL ...

¿Alguna pista donde podría estar el problema? Además, los eventos clave dejan de procesarse por algún motivo cuando agrego subwidgets al GQLWidget.

Actualización: Probé varias combinaciones de widgets y diseños. Parece que QGLWidget simplemente se dibuja encima de cualquier cosa. Incluso probé con raise() para ordenar la profundidad Z de los widgets, sin éxito. ¿OverlayGL() es la única forma de dibujar encima de un widget OpenGL?

Actualización 2 Después de meses de intentarlo, me di cuenta de que es algo relacionado con QT. Cada vez que se dibuja un QGLWidget encima de otro QGLWidget, no se llama a la función background() del primer. Entonces, hay un botón y se puede hacer clic en él, pero no se dibuja. Mi solución fue dibujar todo usando QPainter, eso funciona. Lo que encuentro curioso es que uno tiene que usar QPainter :: startNativePainting() para dibujar con él. Uno esperaría que sobrecarguen start() en QPainter para llamar a startNativePainting() siempre que un QGLWidget sea el dispositivo de pintura ...

Otro hecho (quizás útil) es que QPainter llama a CHANGE el contexto de OpenGL. Entonces, si tiene otra herramienta en cooperación con QPainter (en mi caso, Visualization Library), es probable que una de ellas falle (en mi caso, VL verifica si el estado del contexto se ha borrado antes de cada cuadro).

+0

¿No puede crear un widget no GL como la ventana principal y un widget GL como su hijo? ? Por lo tanto, los otros controles que desee en su ventana serán hermanos y primos de la ventana GL en lugar de hijos. –

+0

Lo intenté primero - no se queja de algunos problemas GL_SRC_ALPHA. QGLWidget está construido por VL [link] (http://www.visualizationlibrary.org/) y es muy complejo y, por lo tanto, difícil de depurar ... –

+0

¿Está intentando que los objetos derivados de QWidget floten en la parte superior de un QGLWidget? – cmannett85

Respuesta

2

No es un ejemplo laboratorios de renderizado Qt widgets using opengl que es un poco viejo y yo no lo he probado con el qglwidget mejorado en 4,8

También hay un problema con el dibujo sobre la parte superior de un QGLwidget pantalla completa - fue supuestamente un error en el controlador openGL de NVidia. No parece haberse resuelto https://bugreports.qt-project.org/browse/QTBUG-7556

0

¿Intentó llamar a update() explícitamente? Encuentro que a veces QGLWidget actualiza las cosas de la pantalla lentamente.

+0

Sí, la llamada QGLWidgets actualiza explícitamente(). Sospecho que algo con el orden de dibujo no es correcto, pero no sé cómo QT maneja el dibujo de widgets y cómo puede/debe ser influenciado ... –

+0

¿Podría usar alguna función de apertura simple para dibujar alguna geometría básica, como esfera o ¿tetera? Solo para asegurarnos de que QGLWidget dibuje algunas cosas correctamente. Si funciona, significa que hay algunos errores sobre la lib que usa. – NullSpace

+0

El problema no es que la escena openGL no se dibuje. El problema es que está dibujado ** en la parte superior ** de los QWidgets normales. –

1

Si yo fuera usted quisiera utilizar el QGLWidget como un visor para un QGraphicsScene, entonces usted puede sacar sus widgets con un QGraphicsProxyWidget. De esta forma, obtendrá una ventana gráfica OpenGL adecuada con la capacidad de instalar widgets y manipularlos fácilmente.

+0

Lo intenté también, funciona, pero no con mi escenario. Le di mi QGLWidget como una ventana gráfica a GGraphicsView (que representa mi QGraphicsScene), pero falla con un error (esencialmente, QGraphicsScene se queja de que el GLContext es nulo). Creo que esto tiene algo que ver con el hecho de que mi QGLWidget tiene un contexto personalizado ... –

+0

Podría ser que el soporte de OpenGL Qt requiera, usted no tiene. ¿Puedes publicar tu código QGLContext y qué versión de OpenGL estás ejecutando? – cmannett85

+0

'QGLContext * glctx = new QGLContext (context() -> format(), this); QGLFormat fmt = contexto() -> formato(); // configuración de varios formatos de métricas en fmt glctx-> setFormat (fmt); glctx-> create (shareContext); setContext (glctx); ' –

0

Esta es una vieja pregunta, pero recientemente he tenido un poco de problemas con esto, y esto es lo que me ayudó -

Uso QML/Qt Quick. QML es un lenguaje similar a JavaScript que le permite diseñar sus elementos de widgets en una ventana y realizar un procesamiento básico de eventos como clics del mouse. Hay algunas otras características geniales, pero la más relevante para esta pregunta es que puedes importar widgets qt desde código C++.

Para que pueda crear un QGLWidget personalizado, impórtelo en la ventana QML y establezca los widgets de tamaño/posición/barra encima de lo que desee, con mucha facilidad. El ejemplo de QT Scenegraph hace un gran trabajo al explicar esto. El código de Scenegraph también se incluye como un ejemplo en al menos Qt Creator 3.2.1 Open Source (esa es la versión que tengo de todos modos)