eventFilter(QObject *obj, QEvent *e) не обнаруживает правильный объект

Я ожидаю, что моя программа напечатает «мышь на имени метки», когда моя мышь находится на 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;
}

person lll    schedule 20.06.2019    source источник
comment
предоставьте минимальный воспроизводимый пример   -  person eyllanesc    schedule 20.06.2019
comment
Вы установили этот фильтр событий в ui-›lablename? или просто повторно реализовали эту функцию в классе Dialog?   -  person Xplatforms    schedule 20.06.2019
comment
Я просто повторно реализовал эту функцию в диалоговом классе.   -  person lll    schedule 20.06.2019


Ответы (1)


Убедитесь, что вы правильно устанавливаете фильтр событий. Кроме того, если вы хотите отслеживать положение мыши, вам необходимо включить mouseTracking, в противном случае события перемещения не будут инициированы (хотя будут запущены QEvent::Enter и QEvent::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.

person cbuchart    schedule 20.06.2019