我正在尝试制作一个可移动的窗口而不实际创建任何小部件(a 除外QWebView
),我想知道是否可以QMouseEvent
从 JavaScript(内部QWebView
)发出并用 C++ 捕获信号?
我已经知道如何从 JS 调用 C++ 方法(反之亦然),如此处所述,但我问我是否能够生成/发出包含 a 的事件QMouseEvent
(这非常重要,因为当前的全局位置光标)。
我正在尝试制作一个可移动的窗口而不实际创建任何小部件(a 除外QWebView
),我想知道是否可以QMouseEvent
从 JavaScript(内部QWebView
)发出并用 C++ 捕获信号?
我已经知道如何从 JS 调用 C++ 方法(反之亦然),如此处所述,但我问我是否能够生成/发出包含 a 的事件QMouseEvent
(这非常重要,因为当前的全局位置光标)。
毕竟这并不难。
首先,我将窗口暴露给 JavaScript 引擎:
this->webView()->page()->mainFrame()->addToJavaScriptWindowObject("CHtml5ApplicationViewer", this);
然后我在我的 HTML 代码中创建了一个简单的 div,并附加了这个代码来处理鼠标 onClick、onMove 和 onDrag 事件。
document.getElementById("bar").onmousedown = function(e){
CHtml5ApplicationViewer.fakeMousePressEvent(e.pageX, e.pageY);
e.preventDefault();
document.onmousemove = function(e){
CHtml5ApplicationViewer.fakeMouseMoveEvent(e.screenX, e.screenY);
e.preventDefault();
}
this.onmouseup = function(){
document.onmousemove = null;
}
document.getElementById("bar").ondragstart = function() { return false; }
}
最后,我在我的 C++ 代码中添加了两个函数来处理来自我的 JavaScript 代码的调用:
void CHtml5ApplicationViewer::fakeMousePressEvent(int fromBorderX, int fromBorderY){
fromBorderPosition = QPoint(fromBorderX, fromBorderY);
}
void CHtml5ApplicationViewer::fakeMouseMoveEvent(int dragX, int dragY){
move(QPoint(dragX, dragY) - fromBorderPosition);
}
另外,请确保您使这些函数可以从 JS 调用!
public:
Q_INVOKABLE void fakeMousePressEvent(int fromBorderX, int fromBorderY);
Q_INVOKABLE void fakeMouseMoveEvent(int dragX, int dragY);
几乎可以肯定你不能这样做,因为 cpp 驻留在另一个内存而不是运行的 javascript 中。但是我不知道这些工具是什么以及它们是如何设置的。
处理这些问题的常用方法是通过发送字符串/xml/json-objects 或您自己的“脚本语言”来建立某种“中性”中间层/通信通道。如果你自动化这个过程,它通常被称为“序列化对象”,这意味着将其转换为某种格式,您可以将其存储在磁盘上并稍后重新构建,或者将其转换为其他工具可以阅读和理解的“纯文本” . 一个对象驻留在内存中,只要您不在应用程序之间共享内存,它们就无法理解正在发生的事情。
例如,使用您自己的“脚本语言”总是通过自定义函数调用notifyCPP(header, parameter)
一个示例notifyCPP("MOUSE_POSITION_UPDATE", "x=189; y=200");