sábado, 3 de enero de 2009

Personalizar tus ventanas en Qt::Ventanas sin marcos (con formas personalizadas)

Ya vistos los ejemplos anteriores, ahora se tiene que la forma de la aplicación no es la deseada. Como en el ejemplo Personalizar tus ventanas en Qt::Ventanas sin marcos (con movilidad en el escritorio) solo que se tiene que añadir estas lineas de código.

Eso se puede resolver de la siguiente manera.

Si bien se puede modificar el método

QSize sizeHint() const;//DEFINE EL TAMAÑO INICIAL DE LA VENTANA

del primer ejemplo, eso no nos permitira darle la forma real que queremos.

En cambio lo haremos con un nuevo metodo que vamos a reescribir.

Archivo cabecera

void resizeEvent(QResizeEvent *event);// DEFINE EL ESPACIO VISIBLE DE LA APLICACION, EN ESTE CASO LA ELIPSE

Archivo CPP

void SinMarco::resizeEvent(QResizeEvent * /* event */) {// DEFINE EL ESPACIO VISIBLE DE LA APLICACION, EN ESTE CASO UNA ELIPSE
  // USAR SOLO UNO DE LAS DOS FORMAS
  //QRegion maskedRegion(10, 10, 1000, 130, QRegion::Rectangle);
  QRegion maskedRegion(10, 10, 1000, 130, QRegion::Elipse); // EL CENTRO DE ESTA ELIPSE ES (10+1000)/2 Y (10+130)/2
  setMask(maskedRegion);
}


Tambien para este ejemplo se puede usar poligonos.

Y así ya tenemos una ventana diferente a las ventanas cuadradas aburridas : ).

Personalizar tus ventanas en Qt::Ventanas sin marcos (con movilidad en el escritorio)

En el ejemplo anterior Personalizar tus ventanas en Qt::Ventanas sin marcos se logroó que la ventana se comportara como se queria; sin los marcos por defecto del sistema.

Ahora este nuevo ejemplo, basado en el anterior, trae unas nuevas características para el manejo de nuestra ventana sin marcos.

Si bien ya tenemos nuestra ventana sin marcos, no podemos moverla por nuestro escritorio, cosa que por demás desagrada, si tomamos en cuenta que queremos cambiarla de posición.

Pues aquí, está la solución, solo tenemos que adicionar estas lineas de código en nuestro ejemplo anterior.

Archivo cabecera

protected:
  void mouseMoveEvent(QMouseEvent *event);
  void mousePressEvent(QMouseEvent *event);
 
  private:
  QPoint dragPosition;


Archivo CPP

void SinMarco::mousePressEvent(QMouseEvent *event) {//PARA MOVER LA APLICACION POR EL ESCRITORIO
  if (event->button() == Qt::LeftButton) {
  dragPosition = event->globalPos() - frameGeometry().topLeft();
  event->accept();
  }
}

void SinMarco::mouseMoveEvent(QMouseEvent *event) {
  if (event->buttons() & Qt::LeftButton) {
  move(event->globalPos() - dragPosition);
  event->accept();
  }
}

Personalizar tus ventanas en Qt::Ventanas sin marcos

Hola amigos, que tal?.

En mi pasar por la programación con Qt, he ido realizando algunas modificaciones a los componentes básicos para darle un aspecto diferente a mis aplicaciones.

Hoy les quiero mostrar parte de esas cosas que he hecho.

Ahora bien lo más importante... el código.

Archivo Cabecera

#ifndef SINMARCO_H
#define SINMARCO_H
#include
class SinMarco : public QWidget {
    Q_OBJECT
    public:
        SinMarco(QWidget *parent = 0);//CONSTRUCTOR, DEFINE QUE LA VENTANA SERA SIN MARCOS
        QSize sizeHint() const;//DEFINE EL TAMAÑO INICIAL DE LA VENTANA ESTA LINEA DE CODIGO ES OPCIONAL
};
#endif



Archivo CPP

#include "sinmarco.h"
SinMarco::SinMarco(QWidget *parent) : QWidget(parent, Qt::FramelessWindowHint) { //DEFINE QUE LA VENTANA SERA SIN MARCOS
    // LA BANDERA Qt::FramelessWindowHint EN EL CONSTRUCTOR QWidget 
    // ES LO UNICO QUE NECESITAMOS PARA HACER QUE NUESTRA APLICACIÓN NO POSEA EL MARCO DE VENTANAS (NI DEL SISTEMA NI DEL LENGUAJE)
}
QSize SinMarco::sizeHint() const {//DEFINE EL TAMAÑO INICIAL DE LA VENTANA OPCIONAL
    return QSize(1000, 130);
    // ESTOS VALORES PUEDEN SER MODIFICADOS A NUESTRO GUSTO

}

Archivo MAIN

#include
#include "sinmarco.h"
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    SinMarco Ventana_Sin_Marco;
    Ventana_Sin_Marco.show();
    return app.exec();
}


Y así hemos concluido nuestra ventana sin marcos.