di  -  martedì 15 Giugno 2010

Prima di iniziare ricordiamo quanto è stato fatto in precedenza: nella prima puntata abbiamo visto come utilizzare la libreria universal feed parser, nella seconda come visualizzare alcuni campi del feed sulla nostra interfaccia grafica. Oggi vedremo come sfruttare l’autoconnect per collegare un evento di tipo doppio click all’apertura dell’articolo in una webview.

Per prima cosa riapriamo il designer ed aggiungiamo una webview. Personalmente ho scelto di inserire i due widget (treewidget e webview) in uno splitter ma ovviamente potete organizzarli come preferite.

Una volta finito il lavoro sul designer dobbiamo generare il codice python per l’interfaccia con il tool pyuic4 come fatto nella precedente puntata.
A questo punto possiamo semplicemente accedere alla webview all’interno della nostra classe Main facendo riferimento a:

self.ui.webView

Naturalmente abbiamo bisogno dell’url dei vari articoli per poterli visualizzare. Per farlo modifichiamo il ciclo per l’inserimento degli item nel treewidget passando anche il campo link dell’entry del feed:

for entry in ad.entries:
	        item = QTreeWidgetItem([entry.title,entry.author, entry.slash_comments, entry.link])
	        self.ui.treeWidget.addTopLevelItem(item)

Il link non verrà visualizzato ma rimarrà comunque accessibile.

Le librerie grafiche Qt utilizzano un sistema per la gestione degli eventi estremamente flessibile chiamato SIGNAL/SLOT. Nelle Qt ogni volta che un widget vuole notificare un evento (come può essere il doppio click) emetterà un SIGNAL. Possiamo quindi collegare un pezzo di codice all’emissione di un particolare segnale.

Nel gergo delle Qt il pezzo di codice connesso al SIGNAL viene chiamato SLOT. Il meccanismo è simile a quello del Callback con due differenze: il SIGNAL non sa chi è in ascolto e si possono connettere tutti gli SLOT che vogliamo ad un SIGNAL.

In questo caso non faremo un uso esplicito di questo meccanismo ma sfrutteremo una caratteristica delle PyQt: l’Autoconnect. Basterà definire dei metodi con nomi particolari nella nostra classe Main e verrà creata una connessione implicita ai vari SIGNAL. I nostri metodi dovranno essere chiamati con una nomenclatura di questo tipo:

on_nomeoggetto_nomesegnale

In definitiva questo è quello che aggiungeremo alla nostra classe Main per ottenere l’apertura dell’articolo nella webview quando viene fatto doppio click su un elemento del treewidget:

def on_treeWidget_itemDoubleClicked(self):
        url = QUrl(str(self.ui.treeWidget.currentItem().text(3)))
        self.ui.webView.load(url)

Come avete visto tutto è stato fatto in maniera molto compatta e semplice. A questo punto abbiamo una “specie di primitivo lettore per appunti digitali” :P .

L’idea, prima della stesura di questo articolo, era di fare anche il parsing della pagina dell’articolo per mostrarne solo il contenuto ma per motivi di tempo non sono riuscito a affrontare questo problema. Se siete interessati proverò questa settimana e aggiungerò una quarta parte alla serie di articoli.

8 Commenti »

I commenti inseriti dai lettori di AppuntiDigitali non sono oggetto di moderazione preventiva, ma solo di eventuale filtro antispam. Qualora si ravvisi un contenuto non consono (offensivo o diffamatorio) si prega di contattare l'amministrazione di Appunti Digitali all'indirizzo info@appuntidigitali.it, specificando quale sia il commento in oggetto.

  • # 1
    Matteo Rincanti
     scrive: 

    Ciao io sarei abbastanza interessato alla parte quarta, ma vedi te se hai tempo, se posso consiglierei di aggiungere a ogni successivo articolo il sorgente completo (magari come \spoiler\).

    Grazie comunque di questi 3 articoli ;-)

  • # 2
    Emanuele Rampichini (Autore del post)
     scrive: 

    @Matteo
    Volevo caricare tutto su un repository mercurial o git ma non ho avuto tempo. Appena ho un po di tregua ripulisco i sorgenti e li carico da qualche parte.

    Grazie a te per il commento. ;-)

  • # 3
    Carlosh
     scrive: 

    Devo dire che questo Python è veramente eccezionale come linguaggio, ho passato la scorsa settimana a studiare e provare le PYQT. Come primo obiettivo ho creato una rudimentale GUI per il comando pyuic4 e mi sono stupito di vedere come sia stato semplice realizzarlo.

    A proposito di questo terzo appuntamento avrei una domanda, come faccio ad inserire i due widget in uno splitter ? O meglio, dove trovo questo splitter ?

    Grazie per gli articoli, comunque anch’io sarei interessato ad un quarto appuntamento…
    Ciao.

  • # 4
    Emanuele Rampichini (Autore del post)
     scrive: 

    @Carlosh
    Per inserire i due widget nello splitter li selezioni tutti e 2 (tenendo premuto Ctrl), poi fai click destro e clicchi su:

    “Layout Vertically/Orizzontaly in a Splitter”

  • # 5
    Valerio Turturici
     scrive: 

    Volevo segnalare un piccolo errore di battitura all’inizio dell’articolo. Per accedere alla webView si deve scrivere:

    self.ui.webView

    con la V grande ;)

  • # 6
    Emanuele Rampichini (Autore del post)
     scrive: 

    Grazie della segnalazione. Corretto.

  • # 7
    Carlosh
     scrive: 

    @Emanuele Rampichini
    Grazie per l’aiuto, devo però segnalare che la versione del designer per windows sembra non prevedere la selezione multipla di widget come mi hai suggerito.

    Ero partito dal progetto precedente, dove avevo impostato il layout, che di fatto blocca la possibilità di modificare un widget o di affiancarne altri. Errore mio quindi. (per inesperienza)

  • # 8
    Mulder90
     scrive: 

    Complimenti per tutti e tre gli articoli e per la semplicità con cui hai affrontato l’argomento.
    Python mi sorpende sempre di più e non appena sarò più libero dagli esami lo seguirò sicuramente con attenzione.

Scrivi un commento!

Aggiungi il commento, oppure trackback dal tuo sito.

I commenti inseriti dai lettori di AppuntiDigitali non sono oggetto di moderazione preventiva, ma solo di eventuale filtro antispam. Qualora si ravvisi un contenuto non consono (offensivo o diffamatorio) si prega di contattare l'amministrazione di Appunti Digitali all'indirizzo info@appuntidigitali.it, specificando quale sia il commento in oggetto.