Capítulo 6. Agregando los Widgets Personales

Antes de tener disponibles en el designer los widgets personales (como el MyCanvasView de Jean Pierre ;-), de un modo casi identico al de cualquier otro widget de Qt (como los empleados en el capitulo anterior) o Kde, debemos agregar primero sus “descripciones”.

Cargando las Descripciones

Para cargar las descripciones del widget MyCanvasView accedamos el siguiente menu:

edit custom widget: toolbar

Aparece el siguiente dialogo (observe que este dialogo es el mismo que se emplea para crear las descripciones). Seleccionemos el fichero correspondiente y abramoslo:

edit custom widget: load descriptions

Antes de proseguir, hechemos un vistazo a los Slots disponibles:

edit custom widget: slots

Y comparemos su contenido con el del fichero myclassview.h:

class MyCanvasView : public QCanvasView  {
   Q_OBJECT
public: 
	MyCanvasView(QWidget *parent=0, const char *name=0);
	~MyCanvasView();

public slots:
    void help();
    void aboutQt();
    void clear();
    void addSprite();
    void addCircle();
    void addHexagon();
    void addPolygon();
    void addSpline();
    void addText();
    void addLine();
    void addRectangle();
    void addLogo();
    void addButterfly();
    void enlarge();
    void shrink();
    void rotateClockwise();
    void rotateCounterClockwise();
    void zoomIn();
    void zoomOut();
    void mirror();
    void moveL();
    void moveR();
    void moveU();
    void moveD();

protected:
  void contentsMousePressEvent(QMouseEvent*);
  void contentsMouseMoveEvent(QMouseEvent*);

signals:
  void status(const QString &);

private:
  int imageRTTI;
  QCanvasItem* moving;
  QPoint moving_start;
  QString butterfly_fn;
  QString logo_fn;
  QCanvas * myCanvas;
  QBrush *tb;
  QPen *tp;
  uint mainCount;
  QImage *butterflyimg;
  QImage *logoimg;
};

No esta mal, eh? Ahora a lo que vinimos, agreguemos el dichoso widget a la forma. Ahora si que lo podemos hacer de la misma forma que como lo haciamos con el contenedor y sus botones en el capitulo pasado. Piquemos primero MyCanvasView y luego en el sitio en la forma donde deseamos que quede:

edit custom widget: resultado (common widgets)

El resultado:

edit custom widget: resultado visual (en la forma)

Ahora hagamos un lay out in a grid a la forma (no al widget). La apariencia mejora bastante:

edit custom widget: resultado visual despues de aplicar layout(en la forma)

Conectando los “Signals” a los “Slots”

Ahora vamos a agregar la funcionalidad necesaria para completar nuestra aplicacion: cuando se piquen los botones que hemos instanciado, deseamos que se agreguen los correspondientes objetos graficos en el canvas. En Qt este tipo de “eventos” se manejan mediante el paradigma de Signals y Slots. Vale la pena decir que los Signals y Slots sirven no solo para conectar widgets entre si, sino cualquier par de objetos que hereden de la clase QObject. Pasemos primero a “modo” de edicion de signals y slots:

signal and slot: toolbar invocation

Ahora debemos picar con el raton los dos objetos (uno despues de otro): primero el objeto que emite el signal y segundo el objeto que la recibe (y ejecuta entonces un metodo denominado slot). Observa como se iluminan los objetos seleccionados:

signal and slot: connection boton y canvas

Una vez seleccionados ambos objetos (tanto el emisor como el receptor), entonces aparece el siguiente dialogo:

signal and slot: connection boton y canvas: aparece dialogo

Seleccionemos entonces el signal y el slot que necesitemos (observa que para que un slot este disponible, el tipo de datos del slot debe coincidir con el del signal):

signal and slot: connection boton y canvas: se rellena el dialogo

Compilando Multiples Fuentes

Antes de compilar cualquier cosa debemos incluir las clases de usuario en el proyecto y generar de nuevo el Makefile. Estas clases corresponden a MyCanvasView y sus dependencias: BouncyLogo e ImageItem. Primero activemos el proyecto (por si no lo estaba):

compilando: set active project

Ahora invoquemos del mismo menu, la siguiente entrada:

adding files to active project: invocation

Completemos el dialogo que aparece del siguiente modo:

adding files to active project: dialog

Nota: Es posible que los ficheros se hayan abierto para edicion. Como lo que cuenta era incluirlos en el proyecto (y no editarlos), podemos cerrar las ventanas de edicion correspondientes. Ahora salvamos todo de nuevo (del modo usual File->Save all) y hechemos ahora un vistazo al fichero .pro:

less myeditor.pro

Observa como aparecen las clases agregadas en la seccion de SOURCES. Esto quiere decir que estamos listos para compilar del modo habitual (mediante consola: qmake seguido de make). Finalmente, podemos ejecutar nuestra singular aplicacion:

myeditor execution