Получение позиции щелчка мышью в QLabel

Каков наилучший (как в простейшем) способ получения pos из mousePressedEvent в QLabel? (Или просто получить местоположение щелчка мыши относительно виджета 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;
}

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

2 ответа

Решение

Вы можете создать подкласс 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().

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

неверный static_cast...

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

Сейчас все работает хорошо.

Другие вопросы по тегам