一直对Event Filter似懂非懂, 通过看C++ GUI Programming with Qt4, Second Edition, 争取搞明白. 顺便自己把英文翻译成中文, 算是自己做的笔记了.Installing Event Filters
QT事件模块一个真正强大的特性是可以设置一个QObject的实例去监测另外一个QObject实例的事件,在被监测的实例see之前.假设我们有一个CustomerInfoDialog这样的widget, 它由几个QLineEdit组成.我们想用Spacer键来转变focus到下一个QLineEdit.这个非标准的行为可能对一个内部的程序很合适, 需要培训它的用户来使用它. 一个直接的方法是子类QLineEdit,然后重新实现keyPressEvent()来调用focusNextChild(), 像这样:
void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Space)
{
focusNextChild();
}
else
{
QLineEdit::keyPressEvent(event);
}
}这个方法有一个主要的弊端: 如果我们在这个form中用到几个不同类型的widget(比如QComboBox和QSpinBox), 我们必须也子类化它们来表现出相同的行为. 一个更好的方案是让CustomerInfoDialog来监控它的子widget的按键事件,在监测的代码里执行需要的行为. 这可以用event Filter来达到. 设置一个event filter有两个步骤:
1. 在目标对象上调用installEventFilter(),将监测对象注册到目标对象上.
2. 在监测对象的eventFilter()方法里处理目标对象的事件.在ctor里注册监测对象是一个好地方:
CustomerInfoDialog::CustomerInfoDialog(QWidget *parent) :QDialog(parent)
{
...
firstNameEdit->installEventFilter(this);
lastNameEdit->installEventFilter(this);
cityEdit->installEventFilter(this);
phoneNumberEdit->installEventFilter(this);
}一旦event Filter注册了, 发送到firstNameEdit, lastNameEdit, cityEdit和phoneNumberEdit的事件在被发送到原来的目的地之前, 会先发到CustomerInfoDialog的eventFilter()函数.这是接收这些事件的eventFilter()函数:
bool CustomerInfoDialog::eventFilter(QObject *target, QEvent *event)
{
if (target == firstnameEdit || target == lastNameEdit
|| target == cityEdit || target == phoneNumberEdit)
{
if(event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->key() == Qt::Key_Space)
{
focusNextChild();
return true;
}
}
}
return QDialog::eventFilter(target, event);
}首先,我们检查是否目标widget是一个QLineEdit. 如果是个key Press事件, 把它转换为QKeyEvent, 并检查哪个键值被按下.如果是space, 我们调用focusNextChild()把focus传到focus链上的下一个widget上, 返回true告诉Qt我们已经处理了这个事件. 如果我们返回false, Qt会发送这个event到它原来的目的地,导致一个假的空格被插入到QLineEdit.如果目标widget不是QLineEdit, 或者这个event不是一个space按键, 我们把控制权传回到基类的eventFilter去. 目标wdiget可以是基类-QDialog正在监测的某个widget.
QT for Mips编译环境建立Linux 添加lib库文件相关资讯 Qt
- QT 的信号与槽机制介绍 (04月07日)
- Qt实现文件拆分和融合小工具 (01月08日)
- Qt入门学习——Qt 5 帮助文档的使 (09/16/2015 08:32:11)
| - Qt不再使用LGPLv2.1授权 (01月14日)
- 如何在 Ubuntu 中安装 QGit 客户端 (09/26/2015 10:10:09)
- 在调用Qt库来实现功能过程中的一些 (08/30/2015 08:42:17)
|
本文评论 查看全部评论 (0)