2010-04-26 11 views
6

Esiste un modo per esporre un oggetto/funzione C++ a JavaScript in esecuzione nel browser QtWebKit in Qt? È possibile esporre oggetti ActionScript al codice JS in esecuzione all'interno del browser WebKit in Adobe AIR: sto cercando funzionalità simili in Qt.Esporre l'oggetto C++ su Javascript in Qt

risposta

2

Sì. Dai un'occhiata a this. Dovrebbe essere un buon inizio.

+0

Grazie per le informazioni! – BlueSilver

4

EDIT: collegamento funziona, ma solo nel caso il link ROMPE ANCORA [Link] da Richard Moore ...

Una domanda che ho visto venire più volte sul #qt e QT-interesse è come aggiungere le API personalizzate (specifiche dell'applicazione) a quelle disponibili per impostazione predefinita in QtWebKit. Questo è in realtà piuttosto facile (una volta che sai come) come mostrerò qui sotto. Questo post mostrerà un semplice esempio di come rendere disponibile un oggetto da javascript, inclusi i metodi di chiamata sull'oggetto e i valori di ritorno da C++.

Ci sono due cose che si ha realmente bisogno di sapere per eseguire questa integrazione, il primo è il metodo addToJavaScriptWindowObject() di QWebFrame, questo permette farà la QObject specificato visibile da javascript. La seconda cosa che devi sapere è che gli oggetti pubblicati in in questo modo svaniranno ogni volta che l'oggetto della finestra JavaScript viene cancellato - ie. ogni volta che l'utente naviga verso una nuova pagina. Per evitare che questo causi problemi , QWebFrame fornisce un segnale che ti dice quando l'oggetto è eliminato consentendo di aggiungere nuovamente l'API personalizzata. Questo è in realtà molto più semplice di !

Il nucleo di questo è davvero attuata in due metodi nell'esempio, sono illustrato di seguito:

void MyApi::setWebView(QWebView *view) 
{ 
    QWebPage *page = view->page(); 
    frame = page->mainFrame(); 

    attachObject(); 
    connect(frame, SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(attachObject())); 
} 

void MyApi::attachObject() 
{ 
    frame->addToJavaScriptWindowObject(QString("MyApi"), this); 
} 

Questo codice è tutto ciò che è necessario al fine di rendere tutto il slot pubblici dell'oggetto MyApi visibile a javascript. La classe MyApi offre due slot pubblici: (yes, slot possono restituire le cose)

public slots: 
    void doSomething(const QString &param); 
    int doSums(int a, int b); 

La prima slot i registri semplicemente un messaggio per l'output di debug, il secondo restituisce la somma dei suoi due argomenti . Si chiamano da javascript come questo:

MyApi.doSomething('Hello from JS page 2!!!!'); 

    sum = MyApi.doSums(2, 3); 
    alert('C++ says the sum is ' + sum); 

E questo è tutto ciò che devi fare! È possibile scaricare il codice da>http://xmelegance.org/devel/qtwebkitextension.tar.gz.

+0

Purtroppo questo esempio non è funzionale in QT5. Qualche possibilità di aggiornamento o devo aprire un'altra domanda? – Alex