2

我有一个小问题,希望你能帮助我。

首先:我搜索了几天,发现了一些不同的解决方法,但它们都对我不起作用。

我基本上使用 HTML5 和 Javascript 构建了一个小应用程序 - 没问题。但现在我想把所有的东西都保存到一个文件中。这也不是真正的问题,fstreams 很容易。

现在这是我的问题:如何调用我的函数?我尝试了几种方法,比如制作一个 QtObject 和类似的东西,但这当然不起作用,因为我必须将 Javascript 函数与我的 C++ 函数连接起来。正因为如此,我阅读了 JS-Bridge-Docu(http://qt-project.org/doc/qt-4.8/qtwebkit-bridge.html),但要么我理解得不够好(这肯定在可能性的领域!),或者它对我的问题不够具体,因为我使用内置的 Html5ApplicationViewer 类而不是 QtWeb 类之一。

你能给我解决方案,或者至少给我一个解决这个问题的方法吗?这真的让我发疯,因为这是我项目中唯一的困难。

目前我的代码是这样的:

#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();
}

我知道代码不是很好,但我会在这个问题解决后立即清理它。

4

2 回答 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();
于 2014-02-24T09:25:06.107 回答
0

我在Qt WebView中接口了CodeMirror,这里是基本接口

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() })");
    }
}

在 CodeMirror.h 中,我有

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

允许从 JavaScript 调用 Qt。例如,来自 CodeMirror.html

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

反过来,我有

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

如您所见,它是从 loadFinished 调用的...

于 2014-02-24T09:44:05.427 回答