2010-12-04 32 views
0

QLabelでposmousePressedEventを取得するには、最も簡単な方法は何ですか?QLabelでのマウスクリックの位置の取得

bool MainWindow::eventFilter(QObject *someOb, QEvent *ev) 
{ 
if(someOb == ui->label && ev->type() == QEvent::MouseButtonPress) 
{ 
    QMouseEvent *me = static_cast<QMouseEvent *>(ev); 
    QPoint coordinates = me->pos(); 
    //do stuff 
    return true; 
} 
else return false; 
} 

しかし、私はコンパイルを受け取る:私はフランクは、このように提案し何しようとした(または、基本的にはQLabelウィジェットにマウスクリックの位置を得る)

EDIT

私がmeを宣言しようとする行にエラーinvalid static_cast from type 'QEvent*' to type 'const QMouseEvent*'があります。私がここで間違っていることは何ですか?

答えて

6

QLabelをサブクラス化し、mousePressEvent(QMouseEvent *)を再実装することができます。

bool OneOfMyClasses::eventFilter(QObject* watched, QEvent* event) { 
    if (watched != label) 
     return false; 
    if (event->type() != QEvent::MouseButtonPress) 
     return false; 
    const QMouseEvent* const me = static_cast<const QMouseEvent*>(event); 
    //might want to check the buttons here 
    const QPoint p = me->pos(); //...or ->globalPos(); 
    ... 
    return false; 
} 


label->installEventFilter(watcher); // watcher is the OneOfMyClasses instance supposed to do the filtering. 

イベントフィルタリングの利点は、より柔軟で、サブクラス化を必要としないですか、イベントフィルタを使用しています。しかし、受信したイベントの結果としてカスタム動作が必要な場合、またはサブクラスが既に存在する場合は、fooEvent()を再実装する方が簡単です。

+0

本当に私の宣言に2つの 'const'が必要ですか?もしそうなら、なぜですか?また、コンパイラが 'QEvent * '型から' const QMouseEvent *' '型に無効なstatic_castを与えると、コードをコンパイルするのに問題があります。 – wrongusername

+0

を含めましたか? constは厳密には必要ではありませんが、私は一時変数をconstにすることをお勧めします。 –

+0

ああ、私はそれを含んでいませんでした。ありがとう!私が思っていたのは、なぜ 'const QMouseEvent * me'だけではなかったのかということでした... 2番目のconstは何をしていますか? – wrongusername

0

私は...

を同じ問題

無効にstatic_castを持っていた私は、ヘッダーを含めるのを忘れ:#include "qevent.h"

は今、すべてがうまく機能しています。

関連する問題