常見的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); // 最後將事件交給上層對話框
}