2010-12-04 4 views
0

Каков наилучший (как простейший) способ получить posmousePressedEvent в QLabel? (Или в основном просто получить местоположение щелчка мыши относительно виджета QLabel)Получение позиции щелчка мыши в QLabel

EDIT

Я попробовал то, что Фрэнк предложил таким образом:

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; 
} 

Однако я получаю компиляции ошибка invalid static_cast from type 'QEvent*' to type 'const QMouseEvent*' на линии, где я пытаюсь объявить me. Любые идеи, что я делаю неправильно здесь?

ответ

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`'s в объявлении меня? Если да, то почему? Кроме того, у меня возникла проблема с компиляцией кода, поскольку компилятор дает мне `invalid static_cast из типа 'QEvent *' для ввода 'const QMouseEvent *'` в этой строке – wrongusername 2010-12-04 19:02:17

0

У меня была такая же проблема

недействителен static_cast ...

Я просто забыл включить заголовок: #include "qevent.h"

Теперь все работает хорошо.

 Смежные вопросы

  • Нет связанных вопросов^_^