QDrag::exec()
Qt 5 で何かが変更されたようです:が呼び出されたときの開始点から少なくとも 1 ピクセル移動しないと、ドロップまたは移動イベントを取得できません。Draggable Icons SampledropEvent
の にブレークポイントを置いてから、ボートをクリックして、マウスを動かさずに離してみてください。これにより、ドロップ信号なしで「無視」が生成されます。
(これは Qt 5.1 を搭載した Kubuntu 13.10 にあります。)
ドキュメントでは、ドラッグ操作を開始する方法を教えるときにmanhattanDistance()
、マウスが「ドラッグを開始しようとしているユーザー」として本当に十分に移動したかどうかを判断するために使用することを提案しています。しかし、それを使用する必要はありません。クリック自体で QDrag を起動できます。
ドロップ側で同じ種類の選択肢を持つための回避策を知っている人はいますか、それともその選択肢は完全になくなりましたか? :-/
気にする理由: GUI アプリ (Qt を含む) でマウスの動作を厳密に制御しようとして、長い間フラストレーションを感じていました。不変条件から描画できる信頼できる状態遷移図はないようです。これは、次のような簡単なテストで非常に簡単に反証できるトランプの家です。
virtual void enterEvent(QEvent * event) {
Q_ASSERT(!_entered);
_entered = true;
}
virtual void leaveEvent(QEvent * event) {
Q_ASSERT(_entered);
_entered = false;
}
これはあらゆる種類の方法を壊し、どのように壊すかはプラットフォームによって異なります。 (ここでは、Qt 5.1 を使用する Kubuntu 13.10 について説明します。) マウス ボタンを押してウィジェットの外にドラッグすると、境界を越えたときに leaveEvent を受け取ります...そして、ボタンを押すと別の leaveEvent を受け取ります。解放されます。ウィンドウを離れて画面上のウィンドウで別のアプリをアクティブにし、ウィジェット内をクリックして Qt アプリを再アクティブ化すると、enterEvents が 2 回連続して取得されます。
すべてのマウス イベントでこのパターンを繰り返し、不変条件をしっかりと把握してみてください...頑張ってください! これらを、その状態を「認識」し、バラバラにならない防弾アプリに釘付けにすることは(特に、ワイルドなクリックやalt-Tabキーに直面しても)、少し失われた原因です.
これは、プログラムが割り当てを行い、重い処理を行い、敷物の下で多くのスイープを行いたくない場合には良くありません(たとえば、「ああ、入力されたことに応じて何らかの処理を行っていました... しかし、私はただ無休でまた入ってしまった.んんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんんん向きだと考えてる事で…」
過去に私が行ったことは、すべてのマウス操作 (単純なクリックであっても) をドラッグ & ドロップで処理することでした。OS のドラッグ アンド ドロップ機能を操作に含めると、より堅牢なエクスペリエンスが生成される傾向がありました。これは、テスターが実際に alt-Tab によるタスク切り替えなどを考慮しなければならず、複数のドロップ操作が発生したり、操作が開始されたことを忘れたりしないようにする必要があったためだと推測できます。
しかし、「フレームワークよりも深いレベルで焼き付けられている」という側面により、実際には、この 1 ピクセルの移動要件を変更することは不可能です。タイマーイベントを設定し、QMouseEvent を偽造して、ドラッグが有効になったらカーソルを新しい位置に移動することで、ハックしようとしました。ただし、ドラッグ アンド ドロップはプラットフォーム レベルでフックされており、通常の Qt イベント キューを参照していないと思います: src/plugins/platforms/xcb/qxcbdrag.cpp