QT focusInEvent 事件

来源:互联网 发布:四氧化三铁化学式算法 编辑:程序博客网 时间:2024/06/09 17:54

Qt的事件模型中提供的事件过滤功能使得一个QObject对象可以监视另一个QObject对象中的事件,通过在一个QObject对象中安装事件过滤器可以在事件到达该对象前捕获事件,从而起到监视该对象事件的效果。

实现类似功能的另一种方式是通过分别继承不同的控件类,并重构各控件的事件响应函数,但若窗体中包含大量不同的控件时,每一个控件都必须重新继承,然后分别重构不同的事件函数,实现比较复杂。事件过滤器可以实现在窗体中监视全部控件的不同事件,方便实现功能扩展。

`

[cpp] view plaincopy
  1. #ifndef WIDGET_H  
  2. #define WIDGET_H  
  3. #include <QWidget>  
  4. namespace Ui {  
  5. class Widget;  
  6. }  
  7. class Widget : public QWidget  
  8. {  
  9.      Q_OBJECT  
  10.  public:  
  11.      explicit Widget(QWidget *parent = 0);  
  12.      ~Widget();  
  13.  public slots:  
  14.      bool eventFilter(QObject *,QEvent *);    //注意这里  
  15.  private:  
  16.      Ui::Widget *ui;  
  17. };  
  18. #endif // WIDGET_H  

`

[cpp] view plaincopy
  1. #include "widget.h"  
  2. #include "ui_widget.h"  
  3. #include <QPalette>  
  4. Widget::Widget(QWidget *parent) :  
  5.         QWidget(parent),  
  6.         ui(new Ui::Widget)  
  7. {  
  8.      ui->setupUi(this);  
  9.      ui->lineEdit1->installEventFilter(this);  //在窗体上为lineEdit1安装过滤器  
  10.      ui->lineEdit2->installEventFilter(this);  //在窗体上为lineEdit2安装过滤器  
  11. }  
  12.   
  13. Widget::~Widget()  
  14. {  
  15.      delete ui;  
  16. }  
  17.   
  18. bool Widget::eventFilter(QObject *watched, QEvent *event)  
  19. {  
  20.      if (watched==ui->lineEdit1)         //首先判断控件(这里指 lineEdit1)  
  21.      {  
  22.           if (event->type()==QEvent::FocusIn)     //然后再判断控件的具体事件 (这里指获得焦点事件)  
  23.           {  
  24.               QPalette p=QPalette();  
  25.               p.setColor(QPalette::Base,Qt::green);  
  26.               ui->lineEdit1->setPalette(p);  
  27.           }  
  28.           else if (event->type()==QEvent::FocusOut)    // 这里指 lineEdit1 控件的失去焦点事件  
  29.           {  
  30.               QPalette p=QPalette();  
  31.               p.setColor(QPalette::Base,Qt::white);  
  32.               ui->lineEdit1->setPalette(p);  
  33.            }  
  34.      }  
  35.      if (watched==ui->lineEdit2)           //这里来处理 lineEdit2 , 和处理lineEdit1 是一样的  
  36.      {  
  37.           if (event->type()==QEvent::FocusIn)  
  38.          {  
  39.               QPalette p=QPalette();  
  40.               p.setColor(QPalette::Base,Qt::green);  
  41.               ui->lineEdit2->setPalette(p);  
  42.           }  
  43.          else if (event->type()==QEvent::FocusOut)  
  44.          {  
  45.               QPalette p=QPalette();  
  46.               p.setColor(QPalette::Base,Qt::white);  
  47.               ui->lineEdit2->setPalette(p);  
  48.          }  
  49.      }  
  50.  return QWidget::eventFilter(watched,event);     // 最后将事件交给上层对话框  
  51. }  

`
`
另外,我在一本书上看到作者有一个例子是关于动态按钮的:鼠标未按下时没有任何反应,当鼠标左键按下时图片变大,松开鼠标后又恢复原来的状态。其实这个效果和我这个例子是一个道理,也就是监听按钮的按下事件(QEvent::MouseButtonPress)和释放事件(QEvent::MouseButtonRelease)
`

[cpp] view plaincopy
  1. bool EventFilter::eventFilter(QObject *watched,QEvent *event)  
  2. {  
  3.   if (watched==Label1)  
  4.   {  
  5.       if (event->type()==QEvent::MouseButtonPress)  
  6.       {  
  7.             QMouseEvent *mouseEvent=static_cast<QMouseEvent *>event;  
  8.             if (mouseEvent->buttons() && Qt::LeftButton)  
  9.             {  // 更换一张大一点的图片    ..........  
  10.             }  
  11.       if (event->type()==QEvent::MouseButtonRelease)  
  12.       {    // 重新换回最初那张图片 ...........  
  13.       }  
  14.   return QWidget::eventFilter(watched,event);  
  15. }  
原创粉丝点击