c++ - eventFilter(QObject *obj, QEvent *e) 没有检测到正确的对象

标签 c++ qt mouseevent qevent eventfilter

当我的鼠标位于labelname(QLabel)时,我希望我的程序打印“mouse on label name”,并打印“mouse not on label” name"当我的鼠标不在 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;
}

最佳答案

确保您正在安装 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 中可用。 .

关于c++ - eventFilter(QObject *obj, QEvent *e) 没有检测到正确的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56677525/

相关文章:

c++ - ofstream 写入十六进制而不是 char*

c++ - 将指针的值移动到 C++ 内联汇编(窗口)中的值

JavaFX 构建新的事件链

c++ - 无效转换错误和无效类型

c++ - Linux C++ : How to properly use template specializations across multiple files?

c++ - QT中用双引号替换单引号

c++ - 我如何制作一个QCheckBox来(取消)检查几个QCheckBox?

linux - 如何在 Linux 中包含 Qt 库 (qwebview.h)?

python - 在 Python 中使用 Win32api 获取鼠标滚轮滚动

WPF:按下鼠标左键时 PreviewMouseMove 不会触发?