Событие двойного щелчка QPlainTextEdit

Мне нужно зафиксировать событие двойного щелчка в QPlainTextEdit, который находится внутри QDockWidget.

В моем фактическом коде я установил фильтр событий в 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);
}

С этим кодом сообщение «Двойной щелчок» никогда не отображается. Есть идеи, что не так с кодом?


person hteso    schedule 23.07.2015    source источник
comment
Что произойдет, если вы удалите первый if? Проверьте, получаете ли вы вообще какие-либо события о ui->myPlainTextEdit. Кроме того, почему ваш объект устанавливает на себя фильтр событий? Это может быть проблемой. Вместо этого просто переопределите event().   -  person sashoalm    schedule 23.07.2015
comment
Я проверил, и я получаю события о QPlainTextEdit, это двойной щелчок, который не отображается. Любой пример переопределения event()?   -  person hteso    schedule 23.07.2015
comment
Да, см. doc.qt.io/qt-5/qobject.html#event - это документация. Что касается примера кода, просто погуглите.   -  person sashoalm    schedule 23.07.2015
comment
Можете ли вы сказать мне, какой результат вы получите, добавив приведенную ниже строку кода и дважды щелкнув центр TextEdit !! if (event->type() == QEvent::MouseButtonDblClick){qDebug() << obj->objectName();}   -  person techneaz    schedule 23.07.2015
comment
Нет вывода отладки, если я дважды щелкну QPlainTextEdit, но если я дважды щелкну QDockWidget, он покажет имя виджета док-станции :) Возможно, это связано с тем, что QPlainTextEdit использует mouseDoubleClickEvent вместо MouseButtonDblClick, но я не могу найти, как использовать первый на if поскольку он не является частью QEvent doc.qt.io/qt-5/qplaintextedit .html#mouseDoubleClickEvent   -  person hteso    schedule 23.07.2015


Ответы (1)


  1. QTextEdit наследует QScrollView, и когда вы дважды щелкаете по области просмотра QTextEdit, область просмотра получает событие двойного щелчка. Вы можете перепроверить свой текущий код, дважды щелкнув по краям текстового поля. Он зафиксирует событие.

  2. Чтобы решить эту проблему, добавьте фильтр событий в порт просмотра в дополнение к текущим фильтрам событий, которые вы установили, как показано ниже:

    ui->myPlainTextEdit->viewport()->installEventFilter(this);
    
  3. Затем зафиксируйте событие, используя этот оператор if:

       if ((obj == ui->myPlainTextEdit||obj==ui->myPlainTextEdit->viewport()) &&   
            event->type() == QEvent::MouseButtonDblClick) 
       {
            qDebug() << "Double click"<<obj->objectName();
       }
    
  4. Вы можете зафиксировать позицию щелчка, используя QMouseEvent:

    QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
    qDebug()<<QString("Click location: (%1,%2)").arg(mouseEvent->x()).arg(mouseEvent->y());
    
person techneaz    schedule 23.07.2015
comment
Спасибо, это работает идеально! Теперь мне нужно преобразовать координаты события в позицию курсора в пределах QPlainTextEdit. К сожалению, нет event->x или event->pos(). Любая идея, как перевести это событие в строку в QPlainTextEdit? - person hteso; 23.07.2015
comment
Хороший совет по поводу области просмотра. Я почти представляю, как провожу часы, пытаясь поймать это событие через QPlainTextEdit в параллельной вселенной. - person Violet Giraffe; 21.07.2016