Qt: Как отловить событие клика QDateEdit? - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь поймать щелчок мыши на виджете QDateEdit, обрабатывая событие QEvent::MouseButtonRelease, но не могу найти способ сделать это. Я попытался переопределить QWidget::event метод родительского виджета, но кажется, что события проходят через дочерние элементы к родительским, и QDateEdit внутренне обрабатывает эти события, не передавая их родителям. Есть ли правильное решение или обходной путь?

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Один из способов сделать это - установить eventFilter.Раздел eventFilter документации Qt предоставляет пример его использования.

Ваш класс окна должен переопределить eventFilter

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
  if (obj == dateEdit) {
    if (event->type() == QEvent::MouseButtonPress) {
        // do what you want to do
        // alternatively use QEvent::MouseButtonRelease 
        return true;
    } else {
        return false;
    }
  } else {
    // pass the event on to the parent class
    return QMainWindow::eventFilter(obj, event);
  }
}

В вашем конструкторе окна,установить фильтр на фактический виджет:

dateEdit->installEventFilter(this);
1 голос
/ 04 апреля 2019

QDateEdit расширяет класс QWidget.Таким образом, вы можете просто наследовать QDateEdit и переопределить virtual void mouseReleaseEvent(QMouseEvent *event) функцию и делать то, что вы хотите там.

Обновление:

Функция mouseReleaseEvent действительно не вызывается.

Попробуйте установить фильтр событий для строки редактирования в QDateEdit.Пример:

MyDateEdit.h

#include <QDateEdit>

class MyDateEdit : public QDateEdit
{
  Q_OBJECT
public:
  MyDateEdit(QWidget *parent = 0);
  bool eventFilter(QObject* object, QEvent* event) override;
};

MyDateEdit.cpp

#include "MyDateEdit.h"    
#include <QDebug>
#include <QEvent>
#include <QLineEdit>

MyDateEdit::MyDateEdit(QWidget *parent) : QDateEdit (parent)
{
  installEventFilter(this);
  lineEdit()->installEventFilter(this);
}

bool MyDateEdit::eventFilter(QObject* object, QEvent* event)
{
  if (object == this || object == lineEdit())
  {
    if (event->type() == QEvent::MouseButtonRelease)
    {
      qDebug() << "Mouse release event";
    }
  }    
  return QDateEdit::eventFilter(object, event);
}
...