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.

1
  • 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: stackoverflow.com/questions/14127098/… Commented Aug 22, 2013 at 19:44

2 Answers 2

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();
Sign up to request clarification or add additional context in comments.

2 Comments

what is meant by webView in "webView->page()->mainFrame()->addToJavaScriptWindowObject("qt", this);"
@Prasoon webView is an instance of QWebView, it's a widget added to the main window.
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...

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.