【问题标题】:eventFilter(QObject *obj, QEvent *e) does not detect right objecteventFilter(QObject *obj, QEvent *e) 没有检测到正确的对象
【发布时间】:2019-11-02 18:36:25
【问题描述】:

我希望我的程序在我的鼠标位于 labelnameQLabel)上时打印“鼠标在标签名称上”,并在我的鼠标不在标签名称上时打印“鼠标不在标签名称上” labelname.

即使我将鼠标放在labelname 上,我的程序仍会打印“鼠标不在标签名称上”。

我如何知道我的鼠标何时不在labelname 上?

bool Dialog::eventFilter(QObject *obj, QEvent *e)
{
    if(qobject_cast<QLabel*>(obj) == ui->labelname) {
    cout << “mouse on label name” << endl;
    }else if(qobject_cast<QLabel*>(obj) != ui->labelname) { 
    cout << “mouse not on label name” << endl;
    }
    return false;
}

【问题讨论】:

  • 你有没有把这个eventFilter“安装”到ui->lablename?还是只是在 Dialog 类中重新实现了这个功能?
  • 我刚刚在对话框类中重新实现了这个功能

标签: c++ qt mouseevent qevent eventfilter


【解决方案1】:

确保您正确安装了event filter。另外,如果要跟踪鼠标位置,则必须启用mouseTracking,否则将不会触发移动事件(尽管QEvent::EnterQEvent::Leave 将是the ones,表示鼠标已进入或离开小部件)。

这里有一个最小的例子来说明如何做到这一点:

MyWidget::MyWidget(QWidget *parent)
  : QWidget(parent)
{
  m_label = new QLabel("Hello world!");
  m_label->setObjectName("m_label");
  m_label->installEventFilter(this);
  m_label->setMouseTracking(true);

  auto hlayout = new QVBoxLayout();
  hlayout->addWidget(m_label);
  setLayout(hlayout);
}

bool MyWidget::eventFilter(QObject* sender, QEvent* event)
{
  if (sender == m_label) {
    qDebug() << sender->objectName() << event->type();

    if (event->type() == QEvent::Enter) {
      qDebug() << "mouse on label name";
    } else if (event->type() == QEvent::Leave) {
      qDebug() << "mouse not on label name";
    }
  }

  return QWidget::eventFilter(sender, event);
}

GitHub 中提供了完整的工作示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 2022-12-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    相关资源
    最近更新 更多