Fwd: Re: [Kde-devel-es] Una duda sobre QPainter

Pablo de Vicente kde-devel-es@mail.kde.org
Sat, 28 Dec 2002 16:34:01 +0100


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1



- ----------  Mensaje Reenviado  ----------

Subject: Re: [Kde-devel-es] Una duda sobre QPainter
Date: Sat, 28 Dec 2002 16:03:13 +0100
From: Pablo de Vicente <pvicentea@wanadoo.es>
To: Miguel Lobo <miguel_l_l@terra.es>

- -----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

El Sábado 28 de Diciembre de 2002 14:24, Miguel Lobo escribió:
> >  Efectivamente el problema era que no usaba un método paintEvent en
> > mi aplicación. Ahora que lo he incluido ya funciona. O bueno...,
> > medio funciona, porque si trato de actualizar los gráficos se
> > quedan los antiguos porque no consigo borrarlos. Emplo
> > repaint(true); y no va y tampoco funciona empleando erase(); Debe
> > ser algo evidente que estoy obviando. Otro error que tengo es que
> > si coloco una ventana encima de mi aplicación pierdo los gráficos
> > al retirarla para dejar mi aplicación en el frente. Es decir es
> > como si los trazos que pinto no fueron persitentes en ese caso
> > (...y demasiado persistentes en el otro).  Estoy perdido ¿a alguien
> > se le ocurre alguna pista de donde puedo mirar?.
>
> ¿Seguro que ahora haces todas las llamadas a los métodos de QPainter
> desde tu paintEvent (o métodos llamados desde tu paintEvent)?  Si es
> así, no sé cuál puede ser el motivo de tus problemas, especialmente
> del segundo.
>
> El primer problema puede ser uno que yo también tuve, y es que
> contrariamente a lo que yo esperaba parece que al llamar a repaint en
> un Widget *no* se llama automáticamente a repaint en los Widget
> hijos.  Es decir, que tú tienes que llamar a repaint manualmente en
> cada uno de los Widgets que quieras actualizar.  (Lo que yo hice,
> aprovechando que repaint es un slot, fue crear una señal en mi Widget
> padre y conectar el slot repaint de cada Widget hijo a esa señal.
> Así, al emitir la señal se repintaban todos los Widget hijos.  No sé
> si sería la solución adecuada, pero bueno).

Hola Miguel,

  Efectivamente has dado en el clavo. El problema es que he creado un método
llamado paintEvent que es del QWidget completo (elts), que contiene el widget
con los trazos (eltsView) y un TabWidget debajo (eltsTab). Al llamarlo de
nuevo no se ejecuta el paintEvent del widget hijo.

Después de leerte he hecho la siguiente chapuza de prueba. Cuando hay que
repintar el widget hago:

eltsView->repaint();
repaint();

La primera instrucción borra el contenido del lienzo, porque no hay un
paintEvent definido para el widget eltsView.
La segunda instrucción llama al paintEvent del widget padre, que es el que
está definido y repinta los trazos de nuevo. Es decir se comporta como yo
quería.

 Esto también resuelve el otro problema que os comentaba. Cuando tapaba la
ventana y la destapaba de nuevo no se podía repintar porque no sabía repintar
el widget hijo. Ahora ya funciona.

 Sin embargo esta solución es poco limpia. Supongo que lo que debería hacer
 es crear un archivo separado y definir en él una clase nueva llamada por
 ejemplo eltsCanvas derivada de QWidget que sólo contenga el lienzo donde
 dibujo, y definir ahí el paintEvent. De este modo no hay problemas cada vez
 que tenga que repintarlo, porque ese widget no tiene hijos.

Gracias por todo, supongo que volveré con más dudas, porque hay más cosas que
no me funcionan bien. De momento voy a ver si rediseño un poco el código un
poco. También quiero dar las gracias a Michael por su sugerencia sobre usar
QPixmap.

saludos,

Pablo.
- -----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE+Db08SItUpHl6kJERAqPyAJwP2VJsWQ8F91Ji4NRxpAqii4jkYQCcDT3P
pHRZfjZt7WhXFYdYSNH5+5k=
=N4yV
- -----END PGP SIGNATURE-----

- -------------------------------------------------------
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE+DcRpSItUpHl6kJERAtb4AJ90PrJNOyDfQsI/a3e+u7aUGTnDrACfbYI2
QB+rzph44eh9qM+yqoLhzR4=
=L28z
-----END PGP SIGNATURE-----