Qt 포커스 이벤트

[2010년 07월 30일 문서]
이전 글 에서 저는 QLineEdit에서 초점이 높은 디스플레이와 초점을 잃은 것을 원상태로 복구하는 작업을 실현했습니다. 이 종류를 다시 계승하고 이벤트 함수를 재구성하는 방식입니다.이 글은 그 글과 바짝 붙어 있다. 여기서 실현하고자 하는 기능도 마찬가지다. 다른 방식인 이벤트 필터 (이벤트 필터) 를 통해 이루어진다.
Qt의 이벤트 모델에서 제공하는 이벤트 필터 기능은 한 QObject 대상이 다른 QObject 대상의 이벤트를 감시할 수 있도록 한다. 한 QObject 대상에 이벤트 필터를 설치하면 이벤트가 이 대상에 도착하기 전에 이벤트를 포착하여 이 대상의 이벤트를 감시하는 효과를 낼 수 있다.
유사한 기능을 실현하는 또 다른 방식은 각각 다른 컨트롤러 종류를 계승하고 각 컨트롤러의 이벤트 응답 함수를 재구성하는 것이다. 그러나 창에 대량의 다른 컨트롤러가 포함될 때 모든 컨트롤러는 반드시 다시 계승한 다음에 각각 다른 이벤트 함수를 재구성해야 하기 때문에 비교적 복잡하다.이벤트 필터는 창에서 모든 컨트롤의 다른 이벤트를 감시할 수 있으며 기능 확장을 편리하게 할 수 있습니다.
http://www.cnblogs.com/hicjiajia/archive/2012/05/30/2526776.html
#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:::Mouse Button Press) 와 방출 이벤트 (QEvent::Mouse Button Release) 이다.
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);
}

좋은 웹페이지 즐겨찾기