我正在尝试创建一个可移动的窗口而不实际创建任何小部件(QWebView
除外),我想知道是否可以从JavaScript发出QMouseEvent
(在QWebView
内部)并用C ++捕获信号?
我已经知道如何从JS调用C ++方法(反之亦然),如here所述,但我问我是否能够生成/发出包含{{1}的事件(因为光标的当前全局位置,这非常重要)。
答案 0 :(得分:2)
毕竟不是那么难。
首先,我将窗口暴露给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);
答案 1 :(得分:0)
几乎可以肯定你不能这样做,因为cpp驻留在另一个内存而不是javascript运行。但是我不知道这些工具是什么以及它们是如何设置的。
处理这些问题的常用方法是通过发送字符串/ xml / json对象或您自己的“脚本语言”来制作某种“中立”的中间层/通信通道。如果你自动化这个过程,它通常被称为“序列化一个对象”,这意味着将它转换为某种格式,你可以将其存储在磁盘上并稍后重建或将其转换为“纯文本”,其他工具可以阅读和理解。对象驻留在内存中,只要您不在应用程序之间共享内存,就无法理解正在发生的事情。
例如,使用您自己的“脚本语言”,始终通过自定义函数notifyCPP(header, parameter)
进行调用,其中示例为notifyCPP("MOUSE_POSITION_UPDATE", "x=189; y=200");