0

在 QLabel中获得posa的最佳(最简单)方法是什么?mousePressedEvent(或者基本上只是获取鼠标点击相对于 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。有什么想法我在这里做错了吗?

4

2 回答 2

9

您可以继承 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() 会更直接。

于 2010-12-04T15:20:28.430 回答
0

我有同样的问题

无效的静态转换...

我只是忘了包括标题:#include "qevent.h"

现在一切正常。

于 2013-12-18T12:51:11.287 回答