P4: Un navigator de web
Acum ca stim sa facem meniuri, vom crea o aplicatie (semi) adevarata P4.
Gratie muncii depuse de Lars Knoll, Antti Koivisto, Waldo Bastian etc., putem sa
folosim KHTML, un widget care poate sa afiseze pagini HTML. Folosind libraria
kio, KHTML poate afisa pagini direct din Internet.
Sa vedem cum functioneaza.
#include
#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();
}
main.cpp
#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;
};
p4.h
#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();
}
p4.cpp
Prima diferenta cu P3 este in fisierul
p4.h. Diferenta consta in faptul ca din
meniul folosit in P3, in
P4 a mai ramas doar codul de iesire din aplicatie. Am scos
sloturile pentru deschidere si salvare ("Open" si "Save").
public slots:
void changeLocation();
void openURLRequest(const KURL &url,
const KParts::URLArgs & );
private:
QLineEdit *location;
KHTMLPart *browser;
Am definit un slot (metoda) changeLocation() care va fi apelata
cind utilizatorul vrea sa incarce o pagina noua, apasind tasta <Enter>
in bara de locatie.
Metoda openURLRequest este un slot apelat cind utilizatorul da clic pe o locatie
din pagina HTML primind ca parametru locatia pe care trebuie sa o deschidem.
Folosim doua widget-uri: unul este de tip QLineEdit folosit
de utilizator pentru introduce locatia pentru pagina pe care vrea s-o
vizualizeze, iar celalalt este de tip KHTMLPart care va afisa pagina
(in acest widget veti vedea pagina HTML incarcata).
QVBox * vbox = new QVBox ( this );
Deoarece vrem sa afisam bara de locatie (QLineEdit) si pagina HTML
(KHTMLPart) una sub alta, folosim QVBox. Acest widget
aranjeaza automat toti copiii in pozitie verticala, unul sub altul (in acelasi mod,
daca folosim QHBox copiii vor fi aranjati pe orizontala,
unul linga altul). Daca modificam dimensiunile ferestrei, acest widget
va avea grija sa modifice si dimensiunile copiilor.
Trebuie sa retineti ca puteti folosi clase mai complexe (cum ar fi QGridLayout)
care vor avea grija de aranjarea widget-urilor sau o puteti face chiar
dumneavoastra, manual. In exemplul nostru, daca se redimensioneaza aplicatia, bara de
locatie isi va schimba si ea dimensiunile, pe orizontala de la un cap la celalalt,
pe verticala va ramane fixa si KHTMLPart va umple restul ferestrei principale
(atit pe orizontala, cit si pe verticala).
location = new QLineEdit ( vbox );
location->setText( "http://localhost" );
Cream bara de locatie, un obiect de tip QLineEdit care este un copil
pentru vbox si punem textul care va fi afisat (la inceput) in ea.
Putem naviga pe Internet cu acest program, dar cei mai multi vor doar sa-l
testeze pe serverul local asa ca punem "localhost" ca adresa implicita.
Asigurati-va ca aveti serverul Apache pornit ca sa va mearga programul (la fel si
cu urmatoarele exemple).
browser=new KHTMLPart( vbox );
browser->openURL( location->text() );
Acum cream pagina, tot copil al obiectului vbox. Fiind creat dupa bara de locatie
la fel va fi si afisat.
Apelind metoda openURL cerem lui KHTMLPart sa descarce si sa afiseze
pagina de la adresa indicata in bara de locatie.
connect(location , SIGNAL( returnPressed() ),
this, SLOT( changeLocation() ) );
Cind utilizatorul apasa tasta <Enter> in bara de locatie, aceasta emite
semnalul returnPressed(), semnal care il conectam la slotul
changeLocation() al obiectului this.
Acum apelam connect direct (fara QObject::) pentru ca ne aflam
in interiorul unei clase care mosteneste QObject (indirect, clasa noastra
mosteneste KMainWindow, care mosteneste QWidget si QWidget
mosteneste QObject).
connect(browser->browserExtension(),
SIGNAL(openURLRequest(const KURL&,const KParts::URLArgs&)),
this,
SLOT(openURLRequest(const KURL&, const KParts::URLArgs&)));
Acum conectam un alt semnal la un slot. Interesant este ca browser
emite semnalul openURLRequest(const KURL &, const KParts::URLArgs &)
cind are o cerere pentru a deschide o locatie (de exemplu, utilizatorul da clic
pe o legatura din pagina), de fapt semnalul nu este emis de catre
obiectul KHTMLPart, ci este emis de catre obiectul browserExtension.
De aceea il folosim ca obiect emitor.
Apropos, parametrul al doilea (const KParts::URLArgs &) nu-l folosim. El este utilizat
doar in cazuri speciale.
setCentralWidget( vbox );
Setam widget-ul vbox ca widget central al obiectului
KMainWindow.
browser->openURL( location->text() );
Slotul changeLocation cere lui browser sa deschida
legatura scrisa in bara de locatie.
void MainWindow::openURLRequest(
const KURL &url,
const KParts::URLArgs &)
{
location->setText(url.url());
changeLocation();
}
MainWindow::openURLRequest este apelata cind navigatorul vrea sa
deschida o noua legatura. Metoda url() a obiectului KURL va intoarce
legatura completa. O punem in bara de locatie si apelam changeLocation()
pentru ca browser sa incarce noua locatie.
Ginditi-va cita functionalitate am putut da aplicatiei in numai 96 de linii
de cod. Imaginati-va ce poate iesi din 1000 de linii!
|