Programación con Qt4/Mi propio Widget

De Wikilibros, la colección de libros de texto de contenido libre.
Ir a la navegación Ir a la búsqueda

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.

 1 /******** mi_widget.cpp **********/
 2 #include <QApplication>
 3 #include <QPushButton>
 4 #include <QFont>
 5 #include <QWidget>
 6 
 7 class MiWidget:public QWidget { public:MiWidget(QWidget *parent = 0);};
 8 
 9 MiWidget::MiWidget(QWidget *parent):QWidget(parent)
10 {
11     setFixedSize(300,200);
12     QPushButton *boton_salir = new QPushButton(tr("Salir"), this);
13     boton_salir->setGeometry(20,50,150,40);
14     boton_salir->setFont(QFont("Times", 18, QFont::Bold));
15     QObject::connect(boton_salir, SIGNAL(clicked()), qApp, SLOT(quit()));
16 }
17  
18 int main(int argc, char *argv[])
19 {
20     QApplication aplicacion(argc, argv);
21     MiWidget mi_boton_salir;
22     mi_boton_salir.show();
23     return aplicacion.exec();
24 }

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
 1 /******** mi_widget.cpp **********/
 2 #include <QApplication>
 3 #include <QPushButton>
 4 #include <QFont>
 5 #include <QWidget>
 6 
 7 class MiWidget:public QWidget { public:MiWidget(QWidget *parent = 0);};
 8 
 9 MiWidget::MiWidget(QWidget *parent):QWidget(parent)
10 {
11     setFixedSize(300,200);
12     QPushButton *boton_salir = new QPushButton(tr("Salir"), this);
13     boton_salir->setGeometry(20,50,150,40);
14     boton_salir->setFont(QFont("Times", 18, QFont::Bold));
15     QObject::connect(boton_salir, SIGNAL(clicked()), qApp, SLOT(quit()));
16 }
17  
18 int main(int argc, char *argv[])
19 {
20     QApplication aplicacion(argc, argv);
21     MiWidget mi_boton_salir;
22     mi_boton_salir.show();
23     return aplicacion.exec();
24 }
 1 /******** widget_ventana.cpp **********/
 2 #include <QApplication>
 3 #include <QPushButton>
 4 #include <QFont>
 5 #include <QWidget>
 6  
 7 int main(int argc, char *argv[])
 8 {
 9     QApplication aplicacion(argc, argv);
10 
11     QWidget ventana;
12     ventana.resize(300,200);
13 
14     QPushButton boton_salir("Salir", &ventana);
15     boton_salir.resize(200, 130);
16     boton_salir.setFont(QFont("Times", 18, QFont::Bold));
17     boton_salir.setGeometry(20,50,150,40);
18     QObject::connect(&boton_salir, SIGNAL(clicked()), &aplicacion, SLOT(quit()));
19 
20     ventana.show();
21     return aplicacion.exec();
22 }

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
1 /******** mi_widget.cpp **********/
2 
3 int main(int argc, char *argv[])
4 {
5     QApplication aplicacion(argc, argv);
6     MiWidget mi_boton_salir;
7     mi_boton_salir.show();
8     return aplicacion.exec();
9 }
1 /******** hola.cpp **********/
2 
3 int main(int argc, char *argv[])
4 {
5     QApplication aplicacion(argc, argv);
6     QLabel etiqueta("Hola Mundo!");
7     etiqueta.show();
8     return aplicacion.exec();
9 }

Crear una ventana
Tema anterior

Mi propio Widget
Índice

Agrupando Widgets
Siguiente tema