QT事件過濾器、事件重載和焦點事件

常見的QT事件有很多,例如:

鍵盤事件: 按鍵按下和鬆開;

鼠標事件: 鼠標移動,鼠標按鍵的按下和鬆開.,雙擊;

拖放事件: 用鼠標進行拖放;滾輪事件: 鼠標滾輪滾動;

繪屏事件: 重繪屏幕的某些部分;

定時事件: 定時器到時觸發;

焦點事件: 鍵盤焦點移動;

進入和離開事件: 鼠標移入widget之內,或是移出;

移動事件: widget的位置改變;

大小改變事件: widget的大小改變;

顯示和隱藏事件: widget顯示和隱藏;

窗口事件: 窗口是否爲當前窗口;

socket事件,剪貼板事件,字體改變,佈局改變等等.

這裏主要通過三個示例來描述事件過濾器、事件重載和焦點事件,也是經常會用到的東西。

1、事件過濾器

QT提供了事件過濾器來在一個部件中監控其他多個部件的事件。事件過濾器與其他部件不同,它不是一個類,只是由兩個函數組成的一種操作,來完成一個部件對其他部件的事件的監視。這兩個函數是installEventFilter()函數和eventFilter()函數,都是Object類中的函數。

示例:

.h文件添加代碼:

bool eventFilter(QObject *, QEvent *);

.cpp文件添加代碼:

在構造函數中添加代碼:

 

ui->register_lbl->installEventFilter(this);    //爲register_lbl在窗口上安裝過濾器

 

下面實現eventFilter()函數,這裏實現了通過點擊一個label來彈出相應的窗口:

 

/*使用事件過濾器來打開註冊窗口*/
bool login::eventFilter(QObject *obj, QEvent *event)
{
    if(obj == ui->register_lbl)         //判斷部件
    {
        if(event->type() == QEvent::MouseButtonPress)         //判斷事件
        {
            Register * reg = new Register;
            this->close();
            reg->setModal(true);
            reg->show();
//            ui->userIDLineEdit->setFocus();
            return true;        //該事件已經被處理
        }
        else
        {
            return false;       //如果是其他事件可以進一步處理
        }
    }
    else
    {
        return login::eventFilter(obj, event);      //將事件交給上層對話框
    }
}

 

 

 

2、重載event()函數

通過重載event()函數,我們可以在事件被特定的事件處理函數處理之前(象keyPressEvent())處理它. 比如, 當我們想改變tab鍵的默認動作時,一般要重載這個函數. 在處理一些不常見的事件(比如:LayoutDirectionChange)時,evnet()也很有用,因爲這些函數沒有相應的特定事件處理函數. 當我們重載event()函數時, 需要調用父類的event()函數來處理我們不需要處理或是不清楚如何處理的事件。

下面這個示例重載了event()函數,,實現改變Tab鍵的默認動作,默認的是鍵盤焦點移動到下一個控件上,代碼如下:

bool CodeEditor::event(QEvent * event)
{
    if (event->type() == QEvent::KeyPress)    //如果是鍵盤按下
    {
        QKeyEvent *keyEvent = (QKeyEvent *) event;
        if (keyEvent->key() == Key_Tab)       //是否按下Tab鍵
        {
            insertAtCurrentPosition(‘\t’);  //do somthing
            return true;
        }
    }
    return QWidget::event(event);
}

 

3、獲得和失去焦點事件

我們可以通過使用事件過濾器來實現獲得和失去焦點事件。Qt的事件模型中提供的事件過濾功能使得一個QObject對象可以監視另一個QObject對象中的事件,通過在一個QObject對象中安裝事件過濾器可以在事件到達該對象前捕獲事件,從而起到監視該對象事件的效果。實現類似功能的另一種方式是通過分別繼承不同的控件類,並重構各控件的事件響應函數,但若窗體中包含大量不同的控件時,每一個控件都必須重新繼承,然後分別重構不同的事件函數,實現比較複雜。事件過濾器可以實現在窗體中監視全部控件的不同事件,方便實現功能擴展。

下面這個示例實現了lineEdit獲得和失去焦點時顏色會有相應的變化:

.h文件中添加代碼:

 

bool eventFilter(QObject *,QEvent *);

.cpp文件中添加代碼:

 

在構造函數中添加代碼:

 

ui->lineEdit->installEventFilter(this);  //在窗體上爲lineEdit安裝過濾器

下面實現焦點事件,代碼如下:

bool Widget::eventFilter(QObject *watched, QEvent *event)
{
     if (watched==ui->lineEdit)         //首先判斷控件(這裏指 lineEdit)     
     {
          if (event->type()==QEvent::FocusIn)     //然後再判斷控件的具體事件 (這裏指獲得焦點事件)          
          {
              QPalette p=QPalette();
              p.setColor(QPalette::Base,Qt::green);
              ui->lineEdit->setPalette(p);
          }
          elseif (event->type()==QEvent::FocusOut)    // 這裏指 lineEdit 控件的失去焦點事件          
          {
              QPalette p=QPalette();
              p.setColor(QPalette::Base,Qt::white);
              ui->lineEdit->setPalette(p);
           }
     }
     return QWidget::eventFilter(watched,event);     // 最後將事件交給上層對話框
}

 

 




 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章