4

初心者の質問で申し訳ありません... MousePressEvent または MouseReleaseEvent が発生したときに実行されるプロシージャを定義する最も簡単な方法は何ですか?

今のところ、QGraphicsView を継承する独自のクラス (MyGraphicsView クラス) を定義し、マウス イベント (仮想関数) を再実装しています。正常に動作しますが、新しいクラスを定義せずにこの問題を解決する方法はありますか? どうにかしてイベントとスロットを接続できますか?

ご協力いただきありがとうございます。

4

5 に答える 5

4

Qt Centerフォーラムのこのスレッドでは、オプションについて詳しく説明しています。簡単に言えば:

  1. あなたがしていることをしなさい(すなわち、サブクラス化と再実装)

  2. スレッドとその中のリンクで説明されているように、イベントフィルターを操作します。

于 2010-08-10T13:28:06.437 に答える
2

マウスイベントは保護された仮想関数であるため、最も簡単なアプローチはまさにあなたがしていることです。サブクラスを定義することが問題を引き起こす理由はわかりませんので、私はあなたが持っているものに固執すると言います。

イベントをスロットに本当に接続したい場合はmousePressEvent()、たとえば、のサブクラス実装を単純に作成できますemit mousePressSignal()。もちろん、サブクラスヘッダーmousePressSignal()のセクションでも宣言する必要があります。signals

于 2010-08-10T13:25:39.083 に答える
1

とをオーバーライドQGraphicsView::mousePressEventしても問題はありませんQGraphisView::mouseReleaseEventQGraphicsView//イベントQGraphicsScene処理の概念全体QGraphicsItemは、仮想イベント処理関数を中心に構築されています。

さらに、QtのドキュメントQGraphicsViewには、「のサブクラスを作成し、マウスとキーのイベントハンドラーを再実装することで、独自のカスタムシーンインタラクションを提供できる」と記載されています。

于 2010-08-10T13:26:20.840 に答える
0

イベントフィルターを使用できます。http://doc.qt.nokia.com/4.6/qobject.html#eventFilterを参照してください または、特にグラフィックアイテムについては、 http://doc.qt.nokia.com/4.6/qgraphicsitemを参照してください。 html#sceneEventFilter

後者の場合、一部のイベントが変更されることに注意してください。たとえば、QMouseEventはQGraphicsSceneMouseEventになるため、適切なタイプをフィルタリングするようにしてください。

何が簡単かは、状況によって異なります。とにかくサブクラスがある場合、仮想メソッドの再実装は、多くの場合、イベントフィルターアプローチよりも簡単です。ただし、複数の異なるクラスの複数のウィジェットを追跡し、特定のイベントに対して特別な処理が必要な場合、この目的のためだけにサブクラス化するのは面倒で、適切な設計ではありません(たとえば、これらのウィジェットにデザイナーを使用するのが難しくなります)。

于 2010-08-10T15:07:43.770 に答える
0

ご質問から、

新しいクラスを定義せずにこの問題を解決する方法はありますか?

答えはノーです。できません

イベントを処理するクラスから継承する必要があります。

どうにかしてイベントとスロットを接続できますか?

いいえイベントをスロットに接続することはできませんが、信号のみをスロットに接続できます。

あなたが今行っている方法は、行うべき方法です。

于 2010-08-10T13:34:29.197 に答える