2010-11-23 24 views
7

QGraphicsViewにカスタムカーソルとプリセットカーソルを混在させようとしています。 私の実装では、ビューの "モード"の概念を作成しました。つまり、ユーザーがどのモードになっているかに応じて、左クリックや左クリックでさまざまなことが起こります。とにかく、それは問題ではなく、ただの文脈です。QGraphicsViewとカスタムカーソル

各モードのカーソルを変更しようとすると問題が発生します。たとえば、モード1では通常の矢印カーソルを表示したいが、モード2ではカスタムpixmapを使いたい。モード1に切り替えるときは、モード2のときはgraphicsview->viewport()->setCursor(our custom cursor)と呼びます。それ以外は全く機能しません。

まず、カーソルはカスタムカーソルに変更されません。それが最初の問題です。ただし、別の操作でグラフィックスビューのドラッグモードがScrollHandDragに設定されている場合、ドラッグ操作が完了するとカーソルはカスタムカーソルに切り替わります。奇妙な。しかしプロットが濃くなります...一度カスタムカーソルに切り替えると、何回何度呼び出してもArrorCursorに戻すことはできません。setCursor(Qt::QArrowCursor)ビューポート上でsetCursorを呼び出すのか、グラフィックスビュー自体を呼び出すのかは関係ありません。

ちょうど楽しみのために、カーソルを変更する直前にgraphicsview->unsetCursor()への呼び出しを追加し、少なくとも2番目の問題を修正します。その間に少しのHandDraggingを行う限り、カーソルはちょうど変わります。より良いが、確かに最適ではない。ただし、ビューポートでunsetCursorを実行しても機能しないことに注意してください。ビューポート上にカーソルを置いているにもかかわらず、グラフィックスビュー上で絶対に行う必要があります。完全に私はカーソル設定した後、私はこれらの2行を追加している問題を超えるパッチに

graphicsview->setDragMode(QGraphicsView::ScrollHandDrag); 
graphicsview->setDragMode(QGraphicsView::NoDrag); 

動作しますが、あなたがたのGADS!だから何か魔法が問題を解決するこれらの2つの方法の中で起こっているが、私は何を参照していないコードを見ている。ドラッグモードが私が想像するカーソルを変更しているという事実とは何か。

ただ、完全を期すために、私はまた、モード変更をトリガーする事がQGraphicsScene->addWidget()を使用してシーンに追加されたのQPushButtonであることを言及する必要があります。私はそれがそれと関係があるかどうか分からないが、あなたは決して知らない。

私はこれらの一見無作為な呼び出しをなぜ行う必要があるか誰かが明らかにできることを望んでいます。私はどこでも間違ったことをしているとは思わない。助けを前にありがとう。

EDIT: 上記のカーソルパッチを使用した実際のコード例を示します。あなたは以下のリンクから見たり、ダウンロードしたりすることができます。ここにペーストするのは少し長かった。私はカーソルが変更されたフレームワークを含めました。なぜなら、それは何とか重要な面白い気持ちがあるからです。

https://gist.github.com/712654

問題があるコードは、カーソルがグラフィックビューに設定されている場合これは、ライン104から始まるMyGraphicsView.cppです。それはまさに上記の通りです。

非常に醜いパッチが適切に配置されているので、カーソルは多かれ少なかれ動作します。これらの行がなければ、上記のポストに列挙されている問題が非常にはっきり分かります。

また、このリンクには、ビューなどを使用するメインウィンドウのすべてのコードが含まれています欠けているのは私が使っている画像だけです。しかし、画像そのものは問題ではありません.16x16のPNGは何も行いません。

+2

graphicsview-> setCursor(...)とgraphicsview-> viewport() - > setCursor(...)を使用すると、私の作品になります。あなたが記述した異常な動作を示す最小限のテストケースを提供できますか? –

+1

質問は古いですが、将来の読者のために、同様の質問で私の提案を見ることができます。タイマーを使ってカーソルの形を設定してください:[リンク](http://stackoverflow.com/questions/5254404/マウスのカーソルが私のインプリメンテーションのインタラクティブになります。/ 5348648#5348648) –

+0

私はこの問題のためにバグレポートを提出しました:https:// bugreports。 qt.io/browse/QTBUG-60752 –

答えて

4
私は同様の問題を解決するためにmuseReleaseEventを追加

は...ドラッグ手中に完了すると、理にかなっています。

4

私の解決策:これは、ドラッグイベントの後にカーソルをリセットします

void mouseReleaseEvent(QMouseEvent *event) { 
    QGraphicsView::mouseReleaseEvent(event); 
    viewport()->setCursor(Qt::CrossCursor); 
} 

view->setDragMode(QGraphicsView::ScrollHandDrag); 
QApplication::setOverrideCursor(Qt::ArrowCursor); 
関連する問題