【问题标题】:Qt - mouse events on a QLabelQt - QLabel 上的鼠标事件
【发布时间】:2015-05-26 12:43:16
【问题描述】:

我在 mainwindow.cpp 中有这段测试代码:

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
  if (event->type() == QEvent::MouseMove)
  {
    QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
    qDebug() << QString("Mouse move (%1,%2)").arg(mouseEvent->pos().x()).arg(mouseEvent->pos().y());
  }
  return false;
}

我只想在单击时获取鼠标位置,然后使用 OpenCV 循环将坐标发送到另一个线程,该循环将提取 HSV 信息并相应地执行操作。我使用鼠标悬停只是为了测试。

问题是我不知道如何将此(跟踪、点击)附加到 QLabel labelKalibracja,我用来显示视频帧,而不是整个窗口。

ui->labelKalibracja->installEventFilter(this);

应该可以工作,但没有,但是

qApp->->installEventFilter(this);

将使整个窗口成为鼠标跟踪区域。

【问题讨论】:

  • 对于跟踪,我认为你也必须设置 setMouseTracking(true)。
  • 我会尝试从 QLabel 进行子类化,并将信号附加到它的 void QWidget::mousePressEvent(QMouseEvent * event)

标签: c++ qt events qlabel


【解决方案1】:

您应该检查事件过滤器的对象:

if (qobject_cast<QLabel*>(obj)==ui->labelKalibracja && event->type() == QEvent::MouseMove)
{
   ...
}

现在您可以确保该事件是针对标签的。请注意,事件过滤器可以安装在多个对象上,您有责任识别对象和事件的组合。

【讨论】:

  • 太棒了!不仅如此,坐标也与整个窗口无关,只是标签,我没有意识到会发生这种情况。感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多