qt焦点事件响应捕捉处理,事件过滤器
2012-09-16 14:40
399 查看
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); // 最后将事件交给上层对话框
}
实现类似功能的另一种方式是通过分别继承不同的控件类,并重构各控件的事件响应函数,但若窗体中包含大量不同的控件时,每一个控件都必须重新继承,然后分别重构不同的事件函数,实现比较复杂。事件过滤器可以实现在窗体中监视全部控件的不同事件,方便实现功能扩展。
#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); // 最后将事件交给上层对话框
}
相关文章推荐
- Qt之Tab键实现(自由切换焦点)—— 采用事件过滤器处理
- Qt中使用事件过滤器来处理键盘焦点
- Qt中使用事件过滤器来处理键盘焦点
- Qt获得焦点和失去焦点处理事件 (Focus事件)
- QT事件处理(二) 之 事件过滤器
- Qt获得焦点和失去焦点处理事件 (Focus事件)
- Qt获得焦点和失去焦点处理事件 (Focus事件)
- Qt事件处理-事件过滤器
- QT学习之事件处理(二) 处理密集响应时的响应保持
- QT事件处理(二) 之 事件过滤器
- Qt 事件处理和事件过滤器的返回值总结
- Qt获得焦点和失去焦点处理事件 (Focus事件)
- Qt获得焦点和失去焦点处理事件 (Focus事件)
- Qt获得焦点和失去焦点处理事件 (Focus事件)
- Qt获得焦点和失去焦点处理事件 (Focus事件)
- QT事件过滤器、事件重载和焦点事件
- Qt之事件过滤器 截获消息通知 自定义消息处理事件解析.
- Qt事件处理-事件过滤器
- QT父子窗口事件传递与事件过滤器
- 使用java的自定义过滤器Filter 处理请求request 并响应response