Pregunta

Tengo una jerarquía simple de widgets: GraphWidget - > MotionWidget - > NodeWidget. Soy nuevo en Qt, por lo que todavía no estoy muy seguro de cómo funcionan algunos interiores. Básicamente, GraphWidget crea un único MotionWidget M y establece el padre M's en sí mismo. M luego desaparece y crea un grupo de NodeWidgets. Sin embargo, los NodeWidgets nunca se pintan ni se llama a su función paintEvent ().

Intenté crear MotionWidget directamente, sin GraphWidget y todo funciona. Entonces, ¿por qué las cosas se rompen si agrego GraphWidget a la jerarquía?

Aquí hay una pasta con los bits de código relevantes de mi proyecto. También incluí el resultado de GraphWidget :: dumpObjectTree () en la parte superior.

Editar: olvidé incluir el enlace pegar;) http://rafb.net/p/Zp39CF94 .html

Actualización: incluí MotionWidget en un diseño.

Antes:

GraphWidget :: GraphWidget( QWidget *parent ) : QWidget( parent )
{
    setFixedSize( 500, 500 );

    MotionWidget *n = new MotionWidget( 5, this );
}

Después

GraphWidget :: GraphWidget( QWidget *parent ) : QWidget( parent )
{
    setFixedSize( 500, 500 );

    QVBoxLayout *l = new QVBoxLayout;

    MotionWidget *n = new MotionWidget( 5 );

    l->addWidget( n );

    setLayout( l );
}

Ahora, este último funciona. Es decir. Todo se dibuja. La pregunta entonces se convierte en ... ¿Por qué? ¿Por qué no funcionó en el primer caso pero funcionó en el segundo?

¿Fue útil?

Solución

Voy a estar en desacuerdo con respuesta de Aiua . Pasar el elemento primario a un objeto agregará el elemento secundario a la jerarquía visual. (De lo contrario, usar Designer para hacer un widget que incluya otros, pero con un posicionamiento absoluto, no funcionaría). Sin embargo, probablemente hubo otros factores que impidieron que la pintura ocurriera.

Debido al hecho de que el diseño hizo que las cosas funcionen, voy a adivinar que en ambas versiones, MotionWidget no tiene un tamaño establecido. Eso significaría en el primer ejemplo que tendría un tamaño de 0x0 píxeles, que Qt optimizará cuando intente pintar. En el segundo ejemplo, el diseño controla el tamaño de los widgets agregados y, por lo tanto, agrandaría MotionWidget , y así comenzaría a recibir eventos de pintura nuevamente.

Para solucionar esto, puede establecer el tamaño explícitamente como lo hace para GraphWidget , o puede hacer un tamaño dinámico basado en el tamaño de los padres, o GraphWidget podría controlar el tamaño, o cualquiera de una gran cantidad de opciones diferentes. Los diseños también pueden ser agradables, pero no son absolutamente obligatorios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top