1

実際にウィジェット(を除く)を作成せずに移動可能なウィンドウを作成しようとしていますが、JavaScript(内部)から出力してC ++でシグナルをキャッチQWebViewできるかどうか疑問に思っていますか?QMouseEventQWebView

ここで説明するように、JSからC ++メソッドを呼び出す方法(およびその逆)はすでに知っていますが、 QMouseEvent(現在のグローバルな位置のために非常に重要です)を含むイベントを生成/発行できるかどうかを尋ねていますカーソルの)。

4

2 に答える 2

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; }
}

最後に、JavaScriptコードからの呼び出しを処理する2つの関数をC++コードに追加しました。

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);
于 2012-12-13T14:52:17.590 に答える
0

cppは実行中のjavascriptとは別のメモリにあるため、ほぼ確実にそれを行うことはできません。しかし、私はそれらのツールが何であるか、そしてそれらがどのように設定されているのか分かりません。

これらの問題に対処する通常の方法は、strings / xml / json-objectsまたは独自の「スクリプト言語」を送信するだけで、ある種の「ニュートラル」な中間層/通信チャネルを作成することです。このプロセスを自動化すると、通常は「オブジェクトのシリアル化」と呼ばれます。これは、ディスクに保存して後で再構築できる形式に変換するか、他のツールが読み取って理解できる「プレーンテキスト」に変換することを意味します。 。オブジェクトはメモリ内に存在し、アプリケーション間でメモリを共有しない限り、アプリケーションが何が起こっているのかを理解する方法はありません。

たとえば、独自の「スクリプト言語」を使用する場合は、常にカスタム関数を使用して呼び出しを行いますnotifyCPP(header, parameter)notifyCPP("MOUSE_POSITION_UPDATE", "x=189; y=200");

于 2012-12-12T15:10:43.057 に答える