QEvent是所有事件类的父类
标记当前事件是否被处理。
有些情况调用accept() 函数 父组件有可能还会处理一下。
class Widget : public QWidget
{
Q_OBJECT
MylineEdit m_lineEdit;
public:
Widget(QWidget *parent = 0);
bool event(QEvent *); // 重写事件处理函数
~Widget();
};
class MylineEdit : public QLineEdit
{
Q_OBJECT
public:
explicit MylineEdit(QWidget *parent = 0);
// 重写事件处理函数
bool event(QEvent* e);
void keyPressEvent(QKeyEvent* e);
};
bool MylineEdit::event(QEvent* e)
{
if( e->type() == QEvent::KeyPress)
{
qDebug() << "MylineEdit::event";
}
return QLineEdit::event(e);
}
void MylineEdit::keyPressEvent(QKeyEvent* e)
{
qDebug() << "MylineEdit::keyPressEvent";
QLineEdit::keyPressEvent(e);
e->ignore(); // 这里忽略当前事件,传给了父组件QWiget
}
//事件过滤器典型实现
/********
返回 true : 表示事件已经处理,无需传递给 obj
返回 false: 正常传递到 obj
*********/
bool Widget::eventFilter(QObject* obj, QEvent* e)
{
if( /* 根据 obj 判断 对象*/)
{
if( /* 根据 e->type() 判断事件)
{
// 事件处理逻辑
}
}
// 调用父类中的同名函数
return QWidget::eventFilter(obj, e);
}
class Widget : public QWidget
{
Q_OBJECT
MylineEdit m_lineEdit;
public:
Widget(QWidget *parent = 0);
bool event(QEvent *);
// 可以重写 是因为任意QObject 可以作为事件过滤器使用
bool eventFilter(QObject * obj, QEvent * e);
~Widget();
};
Widget::Widget(QWidget *parent)
: QWidget(parent), m_lineEdit(this)
{
m_lineEdit.installEventFilter(this);
// 对自己感兴趣的组件进行安装
}
bool Widget::eventFilter(QObject * obj, QEvent * e)
{
bool ret = true;
if( (obj == &m_lineEdit) && (e->type() == QEvent::KeyPress))
{
QKeyEvent* evt = dynamic_cast<QKeyEvent*>(e);
switch(evt->key())
{
case Qt::Key_0:
case Qt::Key_1:
ret = false;
default:
break;
}
}
else
{
return QWidget::eventFilter(obj, e);
}
return ret;
}
事件过滤器在实际工程中有很多用处,需要安装到感兴趣的对象上
截获消息,过滤不要的消息,处理自己想要的消息
注:本笔记根据狄泰软件学院课程做的