2

I've got a little problem and I hope you can help me.

First: I searched for several days and have found some different solution approaches, but they all didn't work for me.

I basically built a little application using HTML5 and Javascript - no problem. But now I want to save all the things to a file. That's no real problem either, fstreams are easy enough.

Now here's my problem: How do I call my function? I've tried several approaches, like making a QtObject and things like that, but that of course didn't work, as I have to connect the Javascript-function with my C++-function. Because of that I read the JS-Bridge-Docu(http://qt-project.org/doc/qt-4.8/qtwebkit-bridge.html), but either I didn't understand it well enough (which is definitely in the realm of possibilitys!), or it's not specific enough for my problem, as I use the built-in Html5ApplicationViewer-class and not one of the QtWeb-classes.

Could you give me the solution, or at least an approach how I could solve this problem? It really drives me crazy, as it's the only difficulty in my project.

At the moment my code is this:

#include <QApplication>
#include <fstream>
#include "html5applicationviewer.h"

using namespace std;

void initFile() {
    fstream f;
    f.open("music.nxc", ios::trunc|ios::out);
    f << "task main() {" << endl;
    f.close();
}

class fileSave : public QObject {
public:
    void saveToFile();
};

void fileSave::saveToFile() {
    fstream f;
    f.open("music.nxc", ios::out|ios::app);
    f << "success!" << endl;
    f.close();
}

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

    Html5ApplicationViewer viewer;
    viewer.resize(1280, 800);
    viewer.setOrientation(Html5ApplicationViewer::ScreenOrientationAuto);
    viewer.showExpanded();

    viewer.loadFile(QLatin1String("html/index.html"));

    initFile();
    fileSave file;

    return app.exec();
}

I know the code is not really good, but I'll clean it up right after this problem is resolved.

Joshua Taylor
  • 84,998
  • 9
  • 154
  • 353
  • You can inject your QObject into the web view frame. All slots of the injected object will be visible for the javascript. See my answer on similar question: http://stackoverflow.com/questions/14127098/qtwebview-c-how-to-get-javascript-string-returned-from-linkclicked-event – Archie Aug 22 '13 at 19:44

2 Answers2

0

abc.h

protected slots:
    void f();

abc.cpp

//in constructor
//make sure that page already loaded
webView->page()->mainFrame()->addToJavaScriptWindowObject("qt", this);


// implement function
void Abc::f()
{
    // do what you want to do
}

abc.js

qt.f();
Tyler Liu
  • 19,552
  • 11
  • 100
  • 84
0

I interfaced CodeMirror in Qt WebView, here is the basic interface

void CodeMirror::loadFinished(bool ok) {
    emit userMessage(log, QString("loadFinished %1... (len %2, ok %3)").arg(text.left(20)).arg(text.length()).arg(ok));
    if (ok) {
        frame()->addToJavaScriptWindowObject("proxy", this);
        if (text.length())
            run("editor.setValue(proxy.plainText)");
        run("editor.on(\"change\", function() { proxy.onChange() })");
    }
}

in CodeMirror.h, I have

//! serve F1 in editor
Q_INVOKABLE void helpRequest(QString topic);

that allows to call Qt from JavaScript. For instance, from CodeMirror.html

extraKeys: { "F1": function(cm) { proxy.helpRequest(cm.getTokenAt(cm.getCursor()).string) } }

The other way round, I have

void CodeMirror::run(QString script) const {
    frame()->evaluateJavaScript(script);
}

as you can see, it's called from loadFinished...

CapelliC
  • 59,646
  • 5
  • 47
  • 90