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.
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 ;-)
@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. ;-)
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.
@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”
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 ;)
Grazie della segnalazione. Corretto.
@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)
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.