跳转到正文

CefViewQuery

window.CefViewQuery(query)是另一种从Javascript中向C++中通信的机制,这种方式的通信是异步操作。更多详细介绍请参见API文档。

当从Javascript中调用该方法时,以下Qt signal会被触发:

public void cefQueryRequest(int browserId,int frameId,const QCefQuery & query)

以下内容将展示CefViewQuery的使用方法。

添加Javascript代码

添加如下Javascript代码:

    function onCallBridgeQueryClicked() {
var query = {
request: document.getElementById("message").value,
onSuccess: function (response) {
alert(response);
},
onFailure: function (error_code, error_message) {
alert(error_message);
},
};
window.CefViewQuery(query);
}

添加HTML代码:

    <label> Test Case for QCefQuery </label>
<br />
<textarea id="message" style="width: 320px; height: 120px">
this message will be processed by native code.
</textarea>
<br />
<input type="button" value="Query" onclick="onCallBridgeQueryClicked()" />

添加C++代码

添加如下C++代码:

MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent)
{
// ...

// connect the cefQueryRequest to the slot
connect(cefViewWidget,
SIGNAL(cefQueryRequest(int, int, const QCefQuery&)),
this,
SLOT(onQCefQueryRequest(int, int, const QCefQuery&)));

// ...
}

void
MainWindow::onQCefQueryRequest(int browserId, int frameId, const QCefQuery& query)
{
QMetaObject::invokeMethod(
this,
[=]() {
QString title("QCef Query Request");
QString text = QString("Current Thread: QT_UI\r\n"
"Query: %1")
.arg(query.request());

QMessageBox::information(this->window(), title, text);

QString response = query.request().toUpper();
query.setResponseResult(true, response);
cefViewWidget->responseQCefQuery(query);
},
Qt::QueuedConnection);
}

运行应用

启动应用,可以看到如下界面:

First Project

点击Web区域的Query按钮,可以看到如下界面:

First Project