Получение позиции щелчка мышью в QLabel - PullRequest
0 голосов
/ 04 декабря 2010

Каков наилучший (как в простейшем) способ получения pos из mousePressedEvent в 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. Есть идеи, что я тут делаю не так?

Ответы [ 2 ]

8 голосов
/ 04 декабря 2010

Вы можете создать подкласс 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 голосов
/ 18 декабря 2013

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

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

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

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

...