eventFilter(QObject * obj,QEvent * e)未检测到正确的对象

时间:2019-06-20 00:32:19

标签: c++ qt mouseevent qevent eventfilter

我希望我的程序在鼠标位于labelname(a QLabel)上时显示“标签名称上的鼠标”,而当我的鼠标位于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; } 上?

{{1}}

1 个答案:

答案 0 :(得分:2)

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

这是一个最小的例子:

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中找到。