Siguiente Anterior Tabla de Contenidos
Ahora que sabemos crear un menú haremos una aplicación casi real en p4. Gracias al trabajo de Lars Knoll, Dirk Mueller, Antti Koivisto, Waldo Bastian y muchos otros, podemos usar un objeto KHTML, un widget que es capaz de mostrar una página HTML, y que usando la libreria KIO es capaz de traer esa página de la red. Veamos como funciona.
#include <kapp.h> #include "p4.h" int main( int argc, char **argv ) { KApplication a( argc, argv, "p4" ); MainWindow *window=new MainWindow( "Tutorial - p4" ); window->resize( 300, 200 ); a.setMainWidget( window ); window->show(); return a.exec(); }
#include <kmainwindow.h> #include <kurl.h> #include <kparts/browserextension.h> class QLineEdit; class KHTMLPart; class MainWindow : public KMainWindow { Q_OBJECT public: MainWindow ( const char * name ); public slots: void changeLocation(); void openURLRequest(const KURL &url, const KParts::URLArgs & ); private: QLineEdit *location; KHTMLPart *browser; };
#include "p4.h" #include <qvbox.h> #include <qlineedit.h> #include <kapp.h> #include <kmenubar.h> #include <klocale.h> #include <kpopupmenu.h> #include <khtml_part.h> MainWindow::MainWindow ( const char * name ) : KMainWindow ( 0L, name ) { setCaption("KDE Tutorial - p4"); QPopupMenu * filemenu = new QPopupMenu; filemenu->insertItem( i18n( "&Quit" ), kapp, SLOT( quit() ) ); QString about = i18n("p4 1.0\n\n" "(C) 1999-2002 Antonio Larrosa Jimenez\n" "larrosa@kde.org\t\tantlarr@supercable.es\n" "Malaga (Spain)\n\n" "Simple KDE Tutorial\n" "This tutorial comes with ABSOLUTELY NO WARRANTY \n" "This is free software, and you are welcome to redistribute it\n" "under certain conditions\n"); QPopupMenu *helpmenu = helpMenu(about); KMenuBar * menu = menuBar(); menu->insertItem( i18n( "&File" ), filemenu); menu->insertSeparator(); menu->insertItem(i18n("&Help"), helpmenu); QVBox * vbox = new QVBox ( this ); location = new QLineEdit ( vbox ); location->setText( "http://localhost" ); browser=new KHTMLPart( vbox ); browser->openURL( location->text() ); connect( location , SIGNAL( returnPressed() ), this, SLOT( changeLocation() ) ); connect( browser->browserExtension(), SIGNAL( openURLRequest( const KURL &, const KParts::URLArgs & ) ), this, SLOT( openURLRequest(const KURL &, const KParts::URLArgs & ) ) ); setCentralWidget( vbox ); } void MainWindow::changeLocation() { browser->openURL( location->text() ); } void MainWindow::openURLRequest(const KURL &url, const KParts::URLArgs & ) { location->setText(url.url()); changeLocation(); }
La primera diferencia que vemos con p3 esta en p4.h . Solo vamos a usar los menús para salir de la aplicación, así que hemos quitado los dos slots que usabamos para los diálogos de Open y Save.
public slots: void changeLocation(); void openURLRequest(const KURL &url, const KParts::URLArgs & ); private: QLineEdit *location; KHTMLPart *browser;
Estamos definiendo un slot changeLocation()
para que sea llamado cuando el
usuario quiera cargar una página pulsando Enter en la barra de dirección .
El método openURLRequest es un slot que se llama cuando el usuario pulsa en un enlace
en la página html, y la página html "nos pide" que abramos esa dirección (que se pasa
como parámetro). Ahora vamos a usar dos widgets, uno es un widget QLineEdit
y el otro un KHTMLPart. QLineEdit implementa una linea en la que el usuario puede editar
texto, en este caso la dirección de la página html que va a mostrar KHTMLPart.
QVBox * vbox = new QVBox ( this );
Estamos usando un QVBox para manejar la disposición (layout) de los widgets. Como queremos mostrar el widget QLineEdit y el KHTMLPart uno bajo el otro, esta es una misión perfecta para QVBox. Este widget automáticamente pone todos sus hijos en una disposición vertical (asi como un QHBox los pone horizontalmente), y actualiza su disposición siempre que el QVBox es redimensionado. Hay que fijarse que podemos usar disposiciones mas complejas usando otras clases, como QGridLayout, para manejar su geometría, o incluso manejarlo manualmente como hacen otros toolkits. Pero todo esto simplifica el código, a la vez que lo hacen más flexible. Hay que observar que cada vez que el usuario redimensiona la ventana, el widget KHTMLPart ocupa la altura máxima que puede mientras que el QLineEdit siempre ocupa una altura fija, y entre los dos siempre ocupan el tamaño total de la ventana principal de la aplicación.
location = new QLineEdit ( vbox ); location->setText( "http://localhost" );
Creamos un objeto QLineEdit, location, como un hijo de vbox y le ponemos algo de texto que sera el que muestre por defecto.
Ahora se puede navegar con internet con esta aplicación, pero como muchas personas solamente lo podran testear con su servidor local web, por estar realizando las pruebas sin conexión a internet, es el que hemos puesto por defecto. Asegurate de estar ejecutando apache en tu máquina para que esta aplicación (¡ y las siguientes !) funcionen.
browser=new KHTMLPart( vbox ); browser->openURL( location->text() );
Con este código creamos el objeto navegador como un hijo de vbox, con lo que será añadido debajo de location (la barra que contiene la dirección).
Llamando a openURL
le pedimos a KHTMLPart que descargue la url que está
escrita en la linea de edición de location, y que lo muestre.
connect( location , SIGNAL( returnPressed() ), this, SLOT( changeLocation() ) );
Cuando el usuario presiona enter en la barra de la dirección, ésta emite una señal
returnPressed()
, con este código conectamos esa señal al slot
changeLocation()
en este (this
) objeto. Podemos llamar
a connect
directamente (sin usar QObject::) ya que estamos en
una clase que hereda de QObject ( indirectamente, ya que heredamos de KMainWindow,
que a su vez hereda de QWidget, que a su vez hereda de QObject).
connect( browser->browserExtension(), SIGNAL( openURLRequest( const KURL &, const KParts::URLArgs & ) ), this, SLOT( openURLRequest(const KURL &, const KParts::URLArgs & ) ) );
Estamos ahora conectando otra señal a un slot. Lo bueno ahora es que el browser
emite una señal openURLRequest( const KURL &, const KParts::URLArgs & )
cuando quiere abrir una URL (por ejemplo, porque el usuario haya pulsado en un enlace). De hecho, la
señal no la emite el propio objeto KHTMLPart, sino su objeto browserExtension, y es por eso que lo
ponemos como primer parámetro (el objeto que emite la señal).
Por cierto, el segundo parámetro no lo usamos, así que vamos a ignorarlo pues sólo se usa en ocasiones muy especiales.
setCentralWidget( vbox );
Ahora ponemos el widget vbox como el widget central del objeto KMainWindow.
browser->openURL( location->text() );
El slot changeLocation
simplemente pide al browser
que abra el url que esta escrito en la barra de dirección.
void MainWindow::openURLRequest(const KURL &url, const KParts::URLArgs & ) { location->setText(url.url()); changeLocation(); }
Éste es el código que se llama cuando el navegador quiere abrir una nueva dirección. Como recordará, el método url() de la clase KURL nos devuelve la url completa, así que la escribimos en la barra de dirección. Entonces llamamos a changeLocation(), para abrir la url que hay en la barra de dirección dentro de la "parte" html.
Piense en todo lo que hemos hecho con sólo 96 lineas. ¡Imagine lo que se puede conseguir con 1000! :-)
Siguiente Anterior Tabla de Contenidos