0

I'm trying to catch mouse click on QDateEdit widget by handling QEvent::MouseButtonRelease event, but can't find a way to do it. I tried to override QWidget::event method of the parent widget, but it seems that events go through children to parent, and QDateEdit internally handles those events without propagating to a parent. Is there any correct solution or workaround?

4

2 回答 2

1

一种方法是安装 eventFilter。Qt 文档的eventFilter 部分提供了如何使用它的示例。

您的窗口类应该覆盖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);
于 2019-04-04T09:34:05.270 回答
1

QDateEdit扩展一个QWidget类。所以你可以继承QDateEdit和覆盖virtual void mouseReleaseEvent(QMouseEvent *event)函数并在那里做你想做的事。

更新:

函数mouseReleaseEvent真的不是调用。

尝试将事件过滤器安装到QDateEdit. 例子:

我的日期编辑.h

#include <QDateEdit>

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

我的日期编辑.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);
}
于 2019-04-04T08:52:20.257 回答