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.
|