1. 程式人生 > >Qt焦點事件

Qt焦點事件

在我的前一篇文章<focusInEvent()與focusOutEvent>中,我實現了QLineEdit獲得焦點高亮顯示與失去焦點恢復原樣的操作,是通過重新繼承該類,再重構該事件函式的方式。這篇文章緊跟那篇文章,這裡要實現的功能也是一樣的,而是通過另外不同的方式——事件過濾器(eventFilter)。

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);
}