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

P8: Un semn de carte destept

P8 este o imbunatatire a lui P6 fiind capabil sa-i trimita lui P7 legaturile pe care le are intr-o lista. Asta ii da posibilitate lui P7 sa deschida legaturile favorite.


#include <kapp.h>
#include "p8.h"
 
int main( int argc, char **argv )
{
    KApplication a( argc, argv, "p8" );
 
    MainList *mylist=new MainList;
    mylist->resize( 300, 200 );
 
    a.setMainWidget( mylist );
    mylist->show();
 
    return a.exec();
}
main.cpp


#include <dcopobject.h>
#include <qstring.h>
 
class p8Iface : virtual public DCOPObject
{
    K_DCOP

k_dcop:
    virtual void add( const QString s ) = 0;
 
};
p8Iface.h


#include "p8Iface.h"
#include <qlistview.h>
 
class MainList : public QListView, virtual public p8Iface
{
 Q_OBJECT
 
public:
 
 MainList();

 void add ( const QString url );
public slots:
 
 void setURLInBrowser ( QListViewItem *item );
 
};
p8.h


#include "p8.h"
#include <klocale.h>
#include <kapp.h>
#include <dcopclient.h>
#include <kdebug.h>
 
MainList::MainList() : QListView ( 0L, "Bookmarks" ),
                        DCOPObject ( "bookmarkList" )
{
  addColumn( i18n("My Bookmarks") );
  connect( this, SIGNAL(clicked(QListViewItem *)),
		this, SLOT(setURLInBrowser(QListViewItem *)));
 
  DCOPClient *client=kapp->dcopClient();
  client->attach();
  client->registerAs("p8");
}
 
void MainList::add( const QString url )
{
  insertItem ( new QListViewItem ( this , url ) );
}
 
void MainList::setURLInBrowser( QListViewItem *item )
{
  if (item==0L) return;
  DCOPClient *client=kapp->dcopClient();
  QByteArray params;
  QDataStream stream(params, IO_WriteOnly);
  stream << item->text(0);
  if (!client->send("p7-*", "browser", "setURL(QString)", params))
    kdDebug() << "Error with DCOP\n";
}
p8.cpp

Fisierele main.cpp si p8Iface.h sint similare cu cele ale lui P6 si de aceea nu le mai comentam.

connect(this, SIGNAL(clicked(QListViewItem *)),
        this, SLOT(setURLInBrowser(QListViewItem *)));

Am adaugat un nou slot, setURLInBrowser(QListViewItem *), care trimite legatura din QListViewItem navigatorului (P7).

Acest exemplu ne arata cum conectam un semnal al unui obiect la un slot al aceluiasi obiect. Desigur aceasta nu este cea mai buna cale, dar cel putin se preteaza la un tutorial ca acesta.

In caz ca nu va amintiti din P6, QListViewItem este clasa care reprezinta un element intr-o lista QListView. Cind dati clic pe un element, obiectul QListView emite un semnal catre slotul la care este legat, primind ca parametru elementul QListViewItem pe care s-a dat clic.

void MainList::setURLInBrowser( QListViewItem *item )
{
  if (item==0L) return;

In acest slot, prima data ne asiguram ca utilizatorul a dat clic pe un element. Daca utilizatorul da clic pe o zona fara elemente, widget-ul tot trimite un semnal dar parametru este NULL. In cazul acesta nu facem nimic.

DCOPClient *client=kapp->dcopClient();
QByteArray params;
QDataStream stream(params, IO_WriteOnly);
stream << item->text(0);

Avem o legatura de trimis. Obtinem obiectul DCOPCLient la fel cum am facut-o si in exemplele P5 si P7 ca sa trimitem mesajele si dupa aceea pregatim fluxul de date.

Cu item->text(0) primim textul de pe prima coloana a elementului pe care s-a dat clic (prima coloana este si singura pe care am creat-o), dupa care o salvam.

if (!client->send("p7-*", "browser", "setURL(QString)", params))
   kdebugError("Error with DCOP");
}

In cele din urma trimitem un apel DCOP catre aplicatia p7, obiectului browser si metodei setURL(QString) cu parametrul params.

Sintem aproape de sfirsitul tutorialului, dar mai intii vom face citeva modificari pentru a simplifica codul sursa, folosind ultimele tehnologii.



Traducere de Bogdan Daniel Vatra. Adaptare de Claudiu Costin.