javascript - 从 JS 发出事件并在 C++ 中捕获它们

标签 javascript c++ qt4

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

我已经知道如何从 JS 调用 C++ 方法(反之亦然),如 here 所述但我想问我是否能够生成/发出包含 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++ 代码中添加了两个函数来处理来 self 的 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);

关于javascript - 从 JS 发出事件并在 C++ 中捕获它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842199/

相关文章:

javascript - 比较 2 个循环结构 JSON 对象

javascript - 多个链接的相同点击功能

javascript - 商店添加 - 不起作用

c++ - Visual Studio 线程 - afxwin 还是 C++11 线程?

c++ - 如何将 QT 国际化集成到 CMake?

c++ - QTextBrowser:如何突出显示单击的行

javascript - 带有 mkdocs 的本地 mathjax

c++ - 为什么类成员函数不能接受多个与其类相同类型的参数

C++ 声明顺序(在多变量声明行中)

user-interface - Qt4:QAbstractTableModel 拖放,不带 MIME