Qtの別のコンテナにドラッグアンドドロップウィジェットを実装するにはどうすればよいですか?[定休日]
質問
私はいくつかのコンテナを持つウィンドウを持っています。それらの間にドラッグアンドドロップを実装する最も簡単な方法は何ですか?
解決
あなたはaを使用する必要があります QDrag*
オブジェクト。その後、再実装します:
virtual void mousePressEvent(QMouseEvent * event);
virtual void mouseReleaseEvent(QMouseEvent * event);
virtual void mouseMoveEvent(QMouseEvent *event);
これらのイベント内では、開始点(ドラッグが開始される場所)と終了点(ウィジェットをドロップする場所)を管理します。また、MIMEプロトコルを使用して、フレームワークがドラッグアンドドロップ操作を管理できるようにします。
ドラッグアンドドロップに関するより便利な記事はこれです: ドラッグアンドドロップ
他のヒント
最も簡単な方法は、私が思うに、作成することです eventFilter
クラスでは、ドラッグアンドドロップイベントをフィルタリングし、 インストール それ(someWidget->installEventFilter
)あなたがドラッグアンドドロップしたいあなたのウィジェットのすべてに。ドキュメントからの例 - ここに
更新:
Eventfilterの問題は、ドラッグアンドドロップを行うためにすべてのウィジェットをサブクラス化する必要がないことです。ただ、あなたがdndフィルタを持っているしたい任意のウィジェットにフィルタをインストールし、それがそれを持っています。
フィルタ自体に関しては、常にイベントなどをブロックするわけではありません(それがあなたの意図であればそれを行います)。それはちょうど一つはそれを使用することができますどのように例エンでした.
ドラッグアンドドロップで数え切れないほどのオプションの1つだけ:dropevent、dragMoveEvent、dragEnterEventでは、フィルタはドロップしたいものへのポインタを覚えておくことができ、dropeventではオブジェクトで信号を出力し、そのイベントはポインタを保持し、
イベントフィルタの全体的なポイントは、共通のイベントタイプがある場合は、ドラッグアンドドロップイベントのように、同様の方法でキャッチして処理したい場合は、すべての単一のウィジェットをサブクラス化して接続することではありません。
私はあなたがドラッグアンドドロップの方法を知っていると仮定しましたが、同じコードを持つすべてのウィジェットのイベントを何度も何度もそこで、ドラッグアンドドロップを使用するすべてのウィジェットに対して、1つのeventfilterで簡単に実行できる方法を示しました。