从JS发出事件并用C ++捕获它们

时间:2012-12-12 14:46:52

标签: javascript c++ qt4

我正在尝试创建一个可移动的窗口而不实际创建任何小部件(QWebView除外),我想知道是否可以从JavaScript发出QMouseEvent(在QWebView内部)并用C ++捕获信号?

我已经知道如何从JS调用C ++方法(反之亦然),如here所述,但我问我是否能够生成/发出包含{{1}的事件(因为光标的当前全局位置,这非常重要)。

2 个答案:

答案 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");