有什么方法可以通过Qt WebChannel使用同步函数调用吗?

问题描述 投票:0回答:2

不像

Qt WebKit Bridge
,我找不到使用
JS side
Qt WebChannel
上使用同步函数调用。

有什么办法吗?

qt qtwebengine
2个回答
3
投票

我觉得没办法。文档中说:QWebChannel

注意 HTML 客户端和 QML/C++ 之间的所有通信 服务器是异步的。

此外,在这篇博客中正是这样说的:Bridge the gap between C++/QML and the web

但是,与WebKit Bridge相反,WebChannel提供的API 是完全异步的。

希望有帮助。


0
投票

这不是一个同步的 QWebChannel 调用,但我找到了一种完全不使用 QWebChannel 就能实现所需功能的方法。

  1. 创建继承自 QWebEnginePage 的自定义类“MyWebEnginePage”。

  2. 按以下方式重载 javaScriptPrompt(...) 方法:

    bool MyWebEnginePage::javaScriptPrompt(const QUrl &securityOrigin, const QString &msg, const QString &defaultValue, QString *result) {
        if (msg.length() > 1 && msg[0] == '^') {
            return processCommand(msg, defaultValue, result);
        }
        return QWebEnginePage::javaScriptPrompt(securityOrigin, msg, defaultValue, result);
    }
    
  3. 添加新方法 bool processCommand(QString param1, QString param2, QString* result):

    bool MyWebEnginePage::processCommand(const QString& param1, const QString& param2, QString* result) {
        // parse param1 and/or param2 to determine what to do and get arguments
        char cmd = param1[1].toLatin1();
        if (cmd == '0') {
            // do something or call some method in c++
            QMessageBox::about(0, QString("Test"), QString("It works: ") + param2);
        }
        else if (cmd == '1') {
            // do something or call some method in c++ and return a string
            // the returned string can be encoded JSON object or base64 string
            *result = QString("some string to return: ") + param2;
            return true;
        }
        return false;
    }
    
  4. 将您的 MyWebEnginePage 分配给 QWebEngineView:

    view->setPage(new MyWebEnginePage());
    
  5. 在 JavaScript 中创建以下对象:

    bridge = {
        doSomething: function (param) {
            window.prompt('^0', param);
        },
        doSomethingAndReturn: function (param) {
            // if you have more arguments encode them into a single string
            return window.prompt('^1', param);
        }
    };
    
  6. 现在您可以通过以下方式从 JavaScript 与 c++ 同步通信:

    bridge.doSomething('input1');
    var returned_string = bridge.doSomethingAndReturn('input2');
    console.log(returned_string);
    
  7. window.prompt 的原始功能仍然有效,但您不能在消息开头使用“^”符号。

缺点是如果要传递更多的参数,必须先将它们全部编码成字符串(例如JSON格式),然后在c++中解码。返回值可以在 JavaScript 桥对象中以相同的方式进行编码和解码。

你也可以重载 javaScriptConfirm 方法,但这只能返回布尔值。

© www.soinside.com 2019 - 2024. All rights reserved.