Arriba

Mejorando los menúes

KDE nos ofrece una clase llamada KStdAction para las acciones que son usadas por la gran mayoría de los programas; esta clase permite crear cada acción con su icono asociado según el tema escogido y la combinación de teclas usada como acelerador. Usando esta clase nos permite tener una unificación en el diseño de la interfaz de usuario entre diversos programas. Se recomienda que cada vez que necesitemos una acción para algo estándar se emplee esta clase. Ahora modificaremos el código para hacer uso de esta facilidad que nos brindan las clases de KDE. Recordando, tendremos los menúes Archivo {Abrir, Salir} y Edición {Copiar, Cortar, Pegar}. Para crearlos usamos los métodos estáticos de la clase dependiendo de la acción que querramos usar; estos métodos usan como mínimo dos parámetros: el objeto recibidor y el SLOT que recibirá el evento cuando se haga click en dicha acción. KDE usa el sistema SIGNAL/SLOT ideado por Qt. Un slot viene siendo un procedimiento que recibirá la señal emitida por un objeto. En el caso de un menú, cuando se hace clic se genera una señal y entonces se llama al slot asociado. El código modificado para mejorar cada menú sería el siguiente:

Archivo KMiMainWindow.cpp
#include "KMiMainWindow.h" #include <kmenubar.h> #include <kpopupmenu.h> // Encabezados añadidos #include <kaction.h> #include <kmessagebox.h> #include <kstdaction.h> KMiMainWindow::KMiMainWindow(QWidget *parent, const char *name) : KMainWindow(parent, name) { setGeometry(0, 0, 400, 400); setCaption("MiMainWindow"); popArchivo = new KPopupMenu(this, "PopupArchivo"); KStdAction::open (this, SLOT(slotAbrir()), 0)->plug(popArchivo); popArchivo->insertSeparator(); KStdAction::quit (this, SLOT(slotSalir()), 0)->plug(popArchivo); popEdicion = new KPopupMenu(this, "PopupEdicion"); KStdAction::cut (this, SLOT(slotCortar()), 0)->plug(popEdicion); KStdAction::copy (this, SLOT(slotCopiar()), 0)->plug(popEdicion); KStdAction::paste(this, SLOT(slotPegar()), 0)->plug(popEdicion); mb = new KMenuBar(this, "MenuBar"); mb->insertItem("&Archivo", popArchivo); mb->insertItem("&Edición", popEdicion); } // SLOT para procesar la acción Abrir void KMiMainWindow::slotAbrir(void) { KMessageBox::information(this, "Se ha presionado Abrir", "KMiMainWindow"); } // SLOT para procesar la acción Copiar void KMiMainWindow::slotCopiar(void) { KMessageBox::information(this, "Se ha presionado Copiar", "KMiMainWindow"); } // SLOT para procesar la acción Cortar void KMiMainWindow::slotCortar(void) { KMessageBox::information(this, "Se ha presionado Cortar", "KMiMainWindow"); } // SLOT para procesar la acción Pegar void KMiMainWindow::slotPegar(void) { KMessageBox::information(this, "Se ha presionado Pegar", "KMiMainWindow"); } // SLOT para procesar la acción Salir void KMiMainWindow::slotSalir(void) { KMessageBox::information(this, "Se ha presionado Salir", "KMiMainWindow"); }
Archivo KMiMainWindow.h
#include <kmainwindow.h> class KMenuBar; class KPopupMenu; class KMiMainWindow : public KMainWindow { Q_OBJECT public: KMiMainWindow(QWidget *parent = 0, const char *name = 0); private: KMenuBar *mb; KPopupMenu *popArchivo; KPopupMenu *popEdicion; private slots: void slotAbrir(void); void slotCopiar(void); void slotCortar(void); void slotPegar(void); void slotSalir(void); };
Archivo kapp.cpp
#include <kapp.h> #include "KMiMainWindow.h" // Encabezados añadidos #include <klocale.h> int main(int argc, char **argv ){ // Para traducir las etiquetas de los menúes según nuestra // i18n le decimos que cargue el catálogo de kdelibs. // Sin ésto, mostrará los objetos KStdAction en inglés. KLocale::setMainCatalogue("kdelibs"); KApplication kaplicacion(argc, argv, "Esquema Básico"); KMiMainWindow *mw = new KMiMainWindow(0, "KMiMainWindow"); kaplicacion.setMainWidget(mw); mw->show(); return kaplicacion.exec(); }

Algo importante a notar en el código del archivo kapp.cpp es el uso de la clase KLocale. Una de las funcionalidades de GNU/Linux es poder portar nuestros programas a otros idiomas sin mucho esfuerzo; para ello se usan los locales y los catálogos de idiomas. Como no hemos creado ningún catálogo para nuestra aplicación, KDE mostrará los textos de los menúes en inglés, pero para poner en el idioma local basta con indicarle que cargue como catálogo principal el de kdelibs que incluye la traducción de las acciones de KStdAction. Una vez cargado dicho catálogo notamos como nuestros textos han sido traducidos a nuestro idioma sin hacer más nada. Basta con comentar esa línea y compilar el programa para notar la diferencia. Posteriormente veremos como crear los catálogos para hacer aplicaciones que puedan ser traducidas a otros idiomas.

Ahora lo compilamos y lo ejecutamos:

make && ./kaplicacion

Y obtenemos nuestra aplicación con un aspecto más KDE y parecido a otras aplicaciones desarrolladas para este entorno. Hay que recordar que la apariencia varia según el tema de iconos, de color y de decoración de ventanas que se hayan escogido.

Menú MejoradoMenú Mejorado

0 comentarios: