Qt HTML5 JavaScript mit C++ binden


#1

Hallo,
Also ich habe per Qt-Creator ein HTML 5 Projekt erstellt. Da verwende ich Qt 4.8 und möchte gerne mit JS eine C++ Funktion aufrufen. Ich habe viel gesucht, aber nichts Sinnvolles gefunden. Jetzt zur meiner Frage: Wie geht das?
Grüße,
MDickie


#2

Also eigentlich gar nicht. Javascript ist eine interpretierte Sprache, welche in der Regel innerhalb eines Browser Sandbox ausgeführt wird. Die Browser bieten meines Wissens nach keine Möglichkeit externe dll zu referenzieren welche dann ausgeführt werden können. Das würde imho auch ein starkes security breach darstellen.

Was gehen könnte ist das ganze mittels node.js auf dem Hostrechner laufen zu lassen Für node gibt es http://stackoverflow.com/questions/9629677/how-can-i-use-a-c-library-from-node-js

Ansonsten musst du einen Dienst auf dem Rechner laufen lassen, auf welchen sich der Javascript Client Code verbindet und die Daten übergibt. Dieser Dienst ruft dann die C++ Routinen auf und übermittelt anschließend das Resultat. Den Dienst würde ich dann auch in C++ schreiben und die Daten mittels Json übermitteln.


#3

Kann man wenigstens über HTML5 direkt einen Save-Dialog öffnen?


#4

Hab in Qt noch nie ein HTML5 Projekt erstellt. Was ist da der Unterschied zu einen normalen Qt-Projekt?

[MENTION=1521]Flowkap[/MENTION]: Hier muss unterschieden werden. Geht sicher nicht um normales Browser-Javascript. Gibt für C++/Qt Javascript Engines/Interpreter die JS in C++/Qt einzubinden und auszuführen. Dazu gehören natürlich auch Bridges um C++ Funktionen im JS anzusprechen. Müsste man Googlen ^^


#5

Ja. Ist aber nicht nicht in allen Browsern implementiert. Da wirst du dir mit FileSaver aushelfen lassen müssen.


#6

Funktioniert leider nicht. Anscheinend unterstützt diese Webkit Version es nicht. [MENTION=1790]TheDarkRose[/MENTION] Ein Qt HTML5 Projekt erstellt mit QtCreator ist eigentlich ein normales Qt Projekt um Webapps innerhalb eines C++ Wrappers zu deployen.


#7

Hast dir die Qt WebKit Bridge schon angeschaut? Damit solltest du Objekte und dessen Methoden/Slots unter JavaScript verfügbar machen,


#8

Noch nicht. Danke für den Tipp.


#9

Danke, Ich habe es jetzt geschafft auf eine Native Methode zuzugreifen. So wird wird es nicht mehr schwierig sein, einen FileManager aufzurufen.
Grüße,
MDickie


#10

Bitte sag doch noch wie… für die Nachwelt.


#11

Hier ein Beispielcode für das Binding, aber nicht angepasst für den QtCreator HTML 5 Wizard (Hatte derzeit keine Lust es zu machen).
main.c:

#include <QMainWindow>
#include <QWebView>
#include <QWebFrame>
#include "myobject.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWebView *view = new QWebView;

    QWebPage *page = view->page();
    QWebFrame *frame = page->mainFrame();

    MyObject myObject;
    frame->addToJavaScriptWindowObject("myObject", &myObject);

    view->load(QUrl("first.html"));
    view->show();
    
    return a.exec();
}```
myobject.cpp:
```#include "myobject.h"
#include <stdio.h>

MyObject::MyObject() {
}

void MyObject::doSomethingWithWebElement() {
    puts("Hello World!");
}

MyObject::~MyObject() {
}```
myobject.h:
```#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QObject>
#include <QWebElement>

class MyObject : public QObject {
        Q_OBJECT
public:
    MyObject();
    ~MyObject();
public slots:
    void doSomethingWithWebElement();
    
signals:
    
    
};

#endif // MYOBJECT_H```
first.html:

```html
<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
         <button onclick="myObject.doSomethingWithWebElement()">Button</button>
    </body>
</html>

Grüße,
MDickie