Qt Focus 事件处理
2015-10-29 14:24
423 查看
在我的前一篇文章<focusInEvent()与focusOutEvent>中,我实现了QLineEdit获得焦点高亮显示与失去焦点恢复原样的操作,是通过重新继承该类,再重构该事件函数的方式。这篇文章紧跟那篇文章,这里要实现的功能也是一样的,而是通过另外不同的方式——事件过滤器(eventFilter)。
Qt的事件模型中提供的事件过滤功能使得一个QObject对象可以监视另一个QObject对象中的事件,通过在一个QObject对象中安装事件过滤器可以在事件到达该对象前捕获事件,从而起到监视该对象事件的效果。
实现类似功能的另一种方式是通过分别继承不同的控件类,并重构各控件的事件响应函数,但若窗体中包含大量不同的控件时,每一个控件都必须重新继承,然后分别重构不同的事件函数,实现比较复杂。事件过滤器可以实现在窗体中监视全部控件的不同事件,方便实现功能扩展。
另外,我在一本书上看到作者有一个例子是关于动态按钮的:鼠标未按下时没有任何反应,当鼠标左键按下时图片变大,松开鼠标后又恢复原来的状态。其实这个效果和我这个例子是一个道理,也就是监听按钮的按下事件(QEvent::MouseButtonPress)和释放事件(QEvent::MouseButtonRelease)
Qt的事件模型中提供的事件过滤功能使得一个QObject对象可以监视另一个QObject对象中的事件,通过在一个QObject对象中安装事件过滤器可以在事件到达该对象前捕获事件,从而起到监视该对象事件的效果。
实现类似功能的另一种方式是通过分别继承不同的控件类,并重构各控件的事件响应函数,但若窗体中包含大量不同的控件时,每一个控件都必须重新继承,然后分别重构不同的事件函数,实现比较复杂。事件过滤器可以实现在窗体中监视全部控件的不同事件,方便实现功能扩展。
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); public slots: bool eventFilter(QObject *,QEvent *); //注意这里 private: Ui::Widget *ui; }; #endif // WIDGET_H ` #include "widget.h" #include "ui_widget.h" #include <QPalette> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); ui->lineEdit1->installEventFilter(this); //在窗体上为lineEdit1安装过滤器 ui->lineEdit2->installEventFilter(this); //在窗体上为lineEdit2安装过滤器 } Widget::~Widget() { delete ui; } bool Widget::eventFilter(QObject *watched, QEvent *event) { if (watched==ui->lineEdit1) //首先判断控件(这里指 lineEdit1) { if (event->type()==QEvent::FocusIn) //然后再判断控件的具体事件 (这里指获得焦点事件) { QPalette p=QPalette(); p.setColor(QPalette::Base,Qt::green); ui->lineEdit1->setPalette(p); } else if (event->type()==QEvent::FocusOut) // 这里指 lineEdit1 控件的失去焦点事件 { QPalette p=QPalette(); p.setColor(QPalette::Base,Qt::white); ui->lineEdit1->setPalette(p); } } if (watched==ui->lineEdit2) //这里来处理 lineEdit2 , 和处理lineEdit1 是一样的 { if (event->type()==QEvent::FocusIn) { QPalette p=QPalette(); p.setColor(QPalette::Base,Qt::green); ui->lineEdit2->setPalette(p); } else if (event->type()==QEvent::FocusOut) { QPalette p=QPalette(); p.setColor(QPalette::Base,Qt::white); ui->lineEdit2->setPalette(p); } } return QWidget::eventFilter(watched,event); // 最后将事件交给上层对话框 }
另外,我在一本书上看到作者有一个例子是关于动态按钮的:鼠标未按下时没有任何反应,当鼠标左键按下时图片变大,松开鼠标后又恢复原来的状态。其实这个效果和我这个例子是一个道理,也就是监听按钮的按下事件(QEvent::MouseButtonPress)和释放事件(QEvent::MouseButtonRelease)
bool EventFilter::eventFilter(QObject *watched,QEvent *event) { if (watched==Label1) { if (event->type()==QEvent::MouseButtonPress) { QMouseEvent *mouseEvent=static_cast<QMouseEvent *>event; if (mouseEvent->buttons() && Qt::LeftButton) { // 更换一张大一点的图片 .......... } if (event->type()==QEvent::MouseButtonRelease) { // 重新换回最初那张图片 ........... } return QWidget::eventFilter(watched,event); }
相关文章推荐
- 解决qt移植中镜像过大问题
- QT5入门之25 -QT 事件
- 我的QT学习笔记-01-HelloWorld纯代码编写程序
- QT5入门之24 -QT 容器
- QT读写Mac 系统的注册文件(.plist文件)
- Qt使用教程之创建一个基于Qt部件的应用程序(二)
- qt的help页面字体太小
- 【C/C++学院】0822-类型转换函数与构造转换函数/类的继承/类的继承以及区别/继承静态成员与静态函数//继承实现代码重用/单继承QT案例/多继承简介以及实战/Gpu编程
- Qt5.3企业版和开源版功能区别
- qt中clicked(bool checked)和toggled(bool checked)的区别
- QT学习资料总结
- 远程启动Qtp/UFT开始测试
- 成为QTP高手必经的四个过程[转]
- QTP 错误截图、处理以及发送
- PyQt4 学习笔记1基本框架
- ubuntu+Qt+OpenGL的环境问题
- 学习Qt(10)
- QT打包
- ubuntu Qt5环境变量设置
- 【Qt多线程之信号量】Qsemaphore