我需要在 QDockWidget 内的 QPlainTextEdit 上捕获双击事件。

在我的实际代码中,我在 QDockWidget 中安装了一个事件过滤器,以处理调整大小操作,并在 QPlainTextEdit 中,以处理双击事件:

// Resize eventfilter
this->installEventFilter(this);
ui->myPlainTextEdit->installEventFilter(this);

但是,虽然它适用于 QDockWidget,但我无法捕捉到 QPlainTextEdit 的双击事件:
bool MyDockWidget::eventFilter(QObject *obj, QEvent *event) {
  if (event->type() == QEvent::Resize && obj == this) {
      QResizeEvent *resizeEvent = static_cast<QResizeEvent*>(event);
      qDebug("Dock Resized (New Size) - Width: %d Height: %d",
             resizeEvent->size().width(),
             resizeEvent->size().height());

  } else if (obj == ui->myPlainTextEdit && event->type() == QMouseEvent::MouseButtonDblClick) {
      qDebug() << "Double click";
  }
  return QWidget::eventFilter(obj, event);
}

使用此代码,永远不会显示消息“双击”。知道代码有什么问题吗?

最佳答案

  • QTextEdit 继承了一个 QScrollView,当你双击 QTextEdit 的视口(viewport)时,视口(viewport)接收双击事件。您可以通过双击文本编辑的边缘来交叉检查当前代码。它将捕获事件。
  • 要解决这个问题,除了你已经安装的当前事件过滤器之外,还要将事件过滤器添加到视口(viewport),如下所示:
    ui->myPlainTextEdit->viewport()->installEventFilter(this);
    
  • 接下来,使用 if 语句捕获事件:
       if ((obj == ui->myPlainTextEdit||obj==ui->myPlainTextEdit->viewport()) &&
            event->type() == QEvent::MouseButtonDblClick)
       {
            qDebug() << "Double click"<<obj->objectName();
       }
    
  • 您可以使用 QMouseEvent 捕获点击位置:
    QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
    qDebug()<<QString("Click location: (%1,%2)").arg(mouseEvent->x()).arg(mouseEvent->y());
    
  • 关于qt - QPlainTextEdit 双击事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31581453/

    10-11 22:57
    查看更多