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?
问问题
773 次
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 回答