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

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))
      kdebugError( "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.

Ahora estamos alcanzando el final del tutorial, pero primero, vamos a hacer algunas modificaciones para simplificar el código fuente y usar las śltimas tecnicas disponibles.

Siguiente Anterior Tabla de Contenidos


© 1999-2002 Antonio Larrosa
Traducido por Rafael Larrosa y Antonio Larrosa