Com’è dura la professione!

26 Ottobre 2009

Compilare KDE 4.4 con Qt4.6 e kdesvn-build

Archiviato in: Open Source, QT, kde4 — lbell @ 21:55

Con il passaggio del trunk di KDE a Qt4.6 avvenuto il 10 ottobre non è più possibile utilizzare il sistema di build basato su kdesvn-build 1.9.1, dato che i sorgenti delle librerie Qt sono affidati a git e kdesvn-build si interfaccia con Subversion, occorrerebbe gestire manualmente il modulo qt-copy. Occorrerebbe, perché è appena stata rilasciata la versione 1.10, che è in grado di gestire git per il solo modulo qt-copy. E’ disponibile nel sito ufficiale da un paio di giorni e nel repository svn di KDE in branches/work/kdesvn-build-1.10. Per usarlo, occorre modificare la sezione relativa al modulo qt-copy nel file .kdesvn-build.rc nel modo seguente nella sezione dedicata a git:

module qt-copy
	#opzioni di compilazione
	configure-flags -system-zlib -qt-gif -system-libjpeg -system-libpng \
			-no-exceptions -fast -debug -dbus \
	            -no-phonon # Phonon built separately
	make-options -j2

	# opzioni di gestione git
	branch 4.6-stable-patched
	repository http://git.gitorious.org/+kde-developers/qt/kde-qt.git
end module

Sito di kdesvn-build:

http://kdesvn-build.kde.org/releases/kdesvn-build-1.10.php

19 Marzo 2009

Un viaggio in WebKit transitando per Plasmaland

Archiviato in: Open Source, Programmazione, QT, kde4 — lbell @ 22:55

Scrivendo una piccola utility per Plasma mi sono fatto tentare dall’uso della nuova versione di WebKit per gestire l’interfaccia utente.

In effetti integrare WebKit in un programma QT o KDE non è troppo difficile, grazie all’uso degli slot e delle metainformazioni che QT aggiunge alle classi. E’ possibile richiamare direttamente i metodi di oggetti residenti nel nostro programma, sfruttando il meccanismo dei segnali e degli slot, dalla pagina HTML via Javascript. Per prima cosa occorre inserire nelle pagine HTML riferimenti agli oggetti C++ della nostra applicazione come se fossero variabili Javascript native, utilizzando un identificatore che verrà mappato sugli oggetti fisici a tempo debito. Fatto ciò possiamo codificare funzioni Javascript che sfruttino i metodi dichiarati come slot, in corrispondenza di determinati eventi, come la pressione di un pulsante. Possiamo quindi dalla pagina HTML eseguire metodi dei nostri oggetti passando quali parametri entità definite al livello HTML, come ad esempio i valori di un form.

Ogni collegamento tra WebKit e la nostra applicazione avverrà sempre tramite funzioni Javascript, quindi sarà WebKit ad iniziare le operazioni.

Facciamo un esempio:

Supponiamo che il nostro obiettivo sia di richiamare da Javascript il metodo ‘reload’ di un’istanza di una classe C++ descritta in questo modo:

class DBusApplet : public
Plasma::PopupApplet
{
    Q_OBJECT
    ...
public
slots:
    void reload(const QString &selection);
private:
    ...
};

in Javascript la nostra istanza può essere mappata come segue, assumendo che sia stata associata all’identificatore ‘appletInterface’:

function execute(selection)
{
    appletInterface.reload(selection);
}

Dato che la conversione dei tipi di base è automatica, quello che occorre fare è ‘iniettare’ gli oggetti C++ all’interno del componente WebKit, ma è necessario attendere che sia il componente ad avvertirci del momento più opportuno.

Al termine del caricamento di una pagina HTML, che la si assegni direttamente da programma o attraverso un URL, il frame corrente emette infatti il segnale “javaScriptWindowObjectCleared”, che occorre avere cura di catturare nel solito modo che QT ci mette a disposizione:

connect(page()->mainFrame(),

SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(populateJavaScriptWindowObject()));

Alla ricezione del segnale possiamo, attraverso il metodo collegato (nell’esempio precedente ‘populateJavaScriptWindowObject’), passare finalmente il riferimento dei nostri oggetti a WebKit attraverso il metodo addToJavaScriptWindowObject, i cui argomenti sono il nome della variabile Javascript associata e l’indirizzo dell’oggetto stesso.

page->mainFrame()->addToJavaScriptWindowObject(“appletInterface”, this);

Se tentassimo di associare i nostri oggetti prima che la pagina sia stata effettivamente caricata, il collegamento non avrebbe successo.

http://doc.trolltech.com/4.4/qtwebkit.html

http://webkit.org/

http://code.google.com/p/dbusapplet/

Blog su WordPress.com.