2016-12-20 8 views
1

C++ APIには、QEventとそれに由来する複数の他のクラス(QMouseEvent、など)があります。一方、QMLにはイベントがあります。しかし、私はQMLで直接C++イベントを処理する洗練された方法を見つけるのに苦労しています。QMLコンテキストでのQt C++イベントの処理

は通常、私は何をすべきか、私はカスタムQQuickWidget(またはQQmlEngineを含む類似した)、QWidget::event(QEvent* event)を上書きを作成し、そのウィジェットを使ってロードされているQMLコードでQMLスロットへの信号を通じて、私はそれを伝播する特定のC++のイベントを受信したときです。これはたくさんの作業のようですが、C++コンテキストから来るイベントのためのQMLビルトインイベント処理があるかどうか疑問に思っています。

特に、私はQGestureEventをQMLで扱いたいと思っていますが、このタイプのイベントにはどのようなタイプのイベントも動作するはずです。

+0

[MultiPointTouchArea](http://doc.qt.io/qt-5/qml-qtquick-multipointtoucharea.html)を使用してみましたか?おそらくあなたのニーズに答えることができるシグナル 'gestureStarted(GestureEvent gesture) 'を持っています。 – dydil

+0

実際にはC++コンテキストから来ているジェスチャーイベントをキャプチャしたいと思っています。たとえば、デバイスからのデータ(C++の手段でしかアクセスできない)をQtのジェスチャーAPIにマッピングして、それをアプリケーションのQML部分に渡す場合です。 Kinectデバイスを使用してジェスチャーを行うなど、リモートで接続することさえできない場合もあります。 – rbaleksandar

+0

"これはたくさんの仕事のようです" - QMLのC++イベント処理を実装するために必要な作業量に比べて、文字通り**何もありません**。 – dtech

答えて

1

QMLでイベント処理を直接サポートすることはできません。キーボードやマウスにも補助オブジェクトからアクセスできます。

QEventは、それ自体が派生したものではないので、同様のことが、全ての派生イベントにも当てはまります。つまり、メタ情報はなく、QMLから簡単に使用することはできません。

特定のタイプのイベントに興味があるので、イベントタイプの独自の補助オブジェクトを作成し、C++で実装し、ハンドラをアタッチできるシグナル経由でQMLにインターフェイスするのが最も簡単です。

+0

これはまっすぐな解決策の点では全く問題にならないようです。 QMLスロットへの信号を介してイベントデータを再ルーティングしなければならないという私の恐れを少なくとも確認します。ありがとう。私は地球上のQMLイベントがどのように実装されているのか疑問に思っています。これらはQEvent'sに基づいているのではなく、何か他のものに基づいているようです... – rbaleksandar

+1

@rbaleksandar - 答えとして、これは補助オブジェクトを通して行われます。例えば、MouseAreaはマウスとシングルタッチイベントのためのものです。 – dtech

+0

ああ、そうです。申し訳ありません。ありがとう。私はそれを行い、それがどのように機能するか見ることができると思います。 – rbaleksandar

1

QGestureEventは、あなたは、単にQ_GADGETベースのアダプタを作成することができ、コピーを構築することができた場合:

class QmlGestureEvent : public QGestureEvent 
{ 
    Q_GADGET 
    Q_PROPERTY(...) // for the things you want to access from QML 

public: 
    QmlGestureEvent(const QGestureEvent &other) : QGestureEvent(other) {} 
}; 

それはコピー構築可能でない場合は、アダプタにデータメンバを追加してから値をコピーする必要があります行事。

+1

コピー構築をサポートするイベントはありません。これは、例えば次のような実装に必要な重大なハッカーの源である。ステートマシンフレームワーク。 Qtは内部的にいくつかの場所でイベントクローニングを実装しています。うまくいけば、それはQt 6のためにきれいになるでしょう。 –

+0

@KubaOberああ、私は参照してください。私は、 'QEvent'自体にコピーコンストラクタがあり、' QGestureEvent'がそれを削除していないように見えたので、コンパイラは基本クラスを呼び出して派生したタイプのデータのメンバコピーを行うデフォルトのものを作成すると想像しました –

+0

このようにしましょう:コピーコンストラクタがあります。しかし、それはサポートされていません。 Qtコードを監査して、コピーしようとするイベントが実際にコピー可能であることを確認する必要があります。別の問題は、具体的なイベントタイプがコピー可能であるかもしれないが、本当に必要なものは、仮想コピーコンストラクタ( 'QEvent'をとる'クローン ')です。 –