Pagina principala
Informatii
Internationalizarea
pROgrame KDE/Qt
Download
Documentatii
Despre LKR
Contact
Resurse
Harta site-ului

Tutorial programare KDE 3


   Antonio Larrosa
   14 martie 2002

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!



Traducere de Bogdan Daniel Vatra. Adaptare de Claudiu Costin.