Programación con Qt4/Mi propio Widget

De Wikilibros, la colección de libros de texto de contenido libre.

Crear un widget personalizado[editar]

Es posible 'crear' un widget personalizado, justo con lo que queramos y/o necesitemos. Esto se realiza usando el metodo 'class' de c++. Ver el código siguiente.

/******** mi_widget.cpp **********/
#include <QApplication>
#include <QPushButton>
#include <QFont>
#include <QWidget>

class MiWidget:public QWidget { public:MiWidget(QWidget *parent = 0);};

MiWidget::MiWidget(QWidget *parent):QWidget(parent)
{
    setFixedSize(300,200);
    QPushButton *boton_salir = new QPushButton(tr("Salir"), this);
    boton_salir->setGeometry(20,50,150,40);
    boton_salir->setFont(QFont("Times", 18, QFont::Bold));
    QObject::connect(boton_salir, SIGNAL(clicked()), qApp, SLOT(quit()));
}
 
int main(int argc, char *argv[])
{
    QApplication aplicacion(argc, argv);
    MiWidget mi_boton_salir;
    mi_boton_salir.show();
    return aplicacion.exec();
}

Descripción[editar]

linea 7
Se observa que se define MiWidget como un objeto public QWidget.
linea 9
Se determina a quien corresponde, en este caso a parent.
linea 11,12,14
Aquí se describen sus propiedades, como el tamaño(size), posición(geometry), fuente(font).
linea 12
Se agrega un botón (QPushButton) a MiWidget.
linea 15
Se asocia el botón al señal de salida, obsérvese que qApp es un 'puntero' a la aplicación.
linea 20-23
Finalmente se muestra el código necesario para cualquier aplicación básica en Qt.

Comparación de código[editar]

Ahora comparemos este código con el anterior, que mostraba un widget prediseñado que se encuentra en la libreria de QWidget.

Observar las lineas resaltadas (linea 21 en mi_widget.cpp y linea 11 en widget_ventana.cpp) estas llaman a un widget (MiWidget y QWidget) que se nombraran mi_boton_salir y Ventana, respectivamente.

Comparando el código actual contra el código del ejemplo previo.
mi_widget.cpp widget_ventana.cpp
/******** mi_widget.cpp **********/
#include <QApplication>
#include <QPushButton>
#include <QFont>
#include <QWidget>

class MiWidget:public QWidget { public:MiWidget(QWidget *parent = 0);};

MiWidget::MiWidget(QWidget *parent):QWidget(parent)
{
    setFixedSize(300,200);
    QPushButton *boton_salir = new QPushButton(tr("Salir"), this);
    boton_salir->setGeometry(20,50,150,40);
    boton_salir->setFont(QFont("Times", 18, QFont::Bold));
    QObject::connect(boton_salir, SIGNAL(clicked()), qApp, SLOT(quit()));
}
 
int main(int argc, char *argv[])
{
    QApplication aplicacion(argc, argv);
    MiWidget mi_boton_salir;
    mi_boton_salir.show();
    return aplicacion.exec();
}
/******** widget_ventana.cpp **********/
#include <QApplication>
#include <QPushButton>
#include <QFont>
#include <QWidget>
 
int main(int argc, char *argv[])
{
    QApplication aplicacion(argc, argv);

    QWidget ventana;
    ventana.resize(300,200);

    QPushButton boton_salir("Salir", &ventana);
    boton_salir.resize(200, 130);
    boton_salir.setFont(QFont("Times", 18, QFont::Bold));
    boton_salir.setGeometry(20,50,150,40);
    QObject::connect(&boton_salir, SIGNAL(clicked()), &aplicacion, SLOT(quit()));

    ventana.show();
    return aplicacion.exec();
}

Si se analiza detenidamente se observa que todas los propiedades y eventos o acciones del widget Ventana en widget_ventana.cpp (linea 12-18) se agrupan al definir la clase de MiWidget en mi_widget.cpp (linea 9-16).

Para finalizar, si se compara la sección main de mi_widget.cpp contra el primer ejemplo de hola mundo (hola.cpp) se observe que prácticamente tiene la misma estructura. La diferencia que se aprecia es en las lineas 6 y 7, y se deben al tipo de widget y al nombre que se le da. En el caso de MiWidget mi_boton_salir no requiere 'argumento' ya que previamente se definió en la linea 12 de mi_widget.cpp (ver el código inicial de esta pagina).

Comparando el código actual contra el código del primer ejemplo.
mi_widget.cpp hola.cpp
/******** mi_widget.cpp **********/

int main(int argc, char *argv[])
{
    QApplication aplicacion(argc, argv);
    MiWidget mi_boton_salir;
    mi_boton_salir.show();
    return aplicacion.exec();
}
/******** hola.cpp **********/

int main(int argc, char *argv[])
{
    QApplication aplicacion(argc, argv);
    QLabel etiqueta("Hola Mundo!");
    etiqueta.show();
    return aplicacion.exec();
}

Crear una ventana
Tema anterior

Mi propio Widget
Índice

Agrupando Widgets
Siguiente tema