Tutorial de KDE - p8

p8

Siguiente Anterior Tabla de Contenidos

Este programa, p8, es una versión actualizada de p6 con la habilidad de enviarle a p7 el url que se seleccione de la lista. Esto permitirá a p7 el abrir nuestros urls favoritos.


#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( QString s ) = 0;
 
};

p8Iface.h


#include "p8Iface.h"
#include <qlistview.h>
 
class MainList : public QListView, virtual public p8Iface
{
 Q_OBJECT
 
public:
 
 MainList();
 
 void add ( 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( 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))
    kdebug( KDEBUG_ERROR, 5858, "Error with DCOP");
}

p8.cpp

Tanto main.cpp, como p8Iface.h son muy similares a los ficheros respectivos en p6, asi que no los comentare.

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

Hemos añadido un nuevo slot, setURLInBrowser(QListViewItem *), que pasa el url que esta en QListViewItem al navegador (browser) (p7).

Este es un curioso ejemplo de como se puede conectar una señal en un objeto a un slot del mismo objeto. Esta claro que no es la mejor manera de conseguir esa funcionalidad, pero al menos deja un código claro para ser usado en un tutorial.

Por si acaso no se recuerda de p6, QListViewItem es la clase que representa un elemento en un QListView. Cuando se pulsa un elemento, el objeto QListView emite una señal con un parámetro que es el QListViewItem sobre el que ha pulsado el usuario.

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

En este slot primero nos aseguramos de que el usuario ha pulsado sobre un elemento. Si se ha pulsado sobre un area vacía el widget emite también una señal (al fin y al cabo el usuario ha pulsado en él), pero con un parámetro NULL. En ese caso no hacemos nada.

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

Si tenemos un url para enviar, cogemos el objeto DCOPCLient tal como hicimos en p5 o p7 para enviar un mensaje DCOP y entonces preparamos el flujo de datos (data stream).

Con item->text(0) cogemos el texto en la primera columna del elemento pulsado (la primera columna es la única que hemos creado), y lo almacenamos en el stream.

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

Finalmente enviamos una llamada DCOP a la aplicación p7, objeto browser y método setURL(QString) con el parámetro params.

Y este es el último paso del tutorial. Espero que hayas aprendido muchas cosas, y decidas comenzar tu propia aplicación con KDE. Si es así, hecha un vistazo a las sugerencias en la Introducción para ver como resolver las dudas que vayan surgiendo y leer algunas ideas sobre como comenzar a escribir la aplicación.

Gracias por leer este tutorial,

Antonio

Siguiente Anterior Tabla de Contenidos


© 1999 Antonio Larrosa
Traducido por Rafael Larrosa