國內(nèi)室內(nèi)設(shè)計(jì)師南寧百度seo軟件
Qt事件處理
一、事件基礎(chǔ)
事件是Qt應(yīng)用程序中的基本構(gòu)建塊,它們代表了一些特定的行為或狀態(tài)變化。事件可以是鼠標(biāo)點(diǎn)擊、鍵盤輸入、窗口大小改變、定時(shí)器事件等。每個(gè)事件都是一個(gè)對象,繼承自QEvent類。
二、事件常見類型
Qt中的事件分為多種類型,每種類型對應(yīng)不同的行為。以下是一些常見的事件類型:
1、鍵盤事件(QKeyEvent): 處理鍵盤按鍵的按下和松開事件。
2、鼠標(biāo)事件(QMouseEvent): 處理鼠標(biāo)移動(dòng)、鼠標(biāo)按鍵的按下和松開事件。
3、拖放事件(QDragEvent 和 QDropEvent): 用鼠標(biāo)進(jìn)行拖放操作時(shí)涉及的事件,包括拖拽和放置。
4、滾輪事件(QWheelEvent): 處理鼠標(biāo)滾輪的滾動(dòng)事件。
5、繪圖事件(QPaintEvent): 在控件需要重新繪制時(shí)觸發(fā),用于自定義繪制。
6、定時(shí)事件(QTimerEvent): 在定時(shí)器到期時(shí)觸發(fā),用于執(zhí)行周期性任務(wù)。
7、焦點(diǎn)事件(QFocusEvent): 處理鍵盤焦點(diǎn)的移動(dòng),如窗口控件獲得或失去焦點(diǎn)。
8、進(jìn)入和離開事件(QEnterEvent 和 QLeaveEvent): 處理鼠標(biāo)移入或移出窗口控件的事件。
9、移動(dòng)事件(QMoveEvent): 處理窗口控件的位置改變事件。
10、大小改變事件(QResizeEvent): 處理窗口控件的大小改變事件。
11、顯示和隱藏事件(QShowEvent 和 QHideEvent): 處理窗口控件的顯示和隱藏事件。
12、窗口事件(QWindowStateChangeEvent): 處理窗口是否為當(dāng)前窗口的狀態(tài)變化事件。
三、事件接收者
每個(gè)繼承自QObject的類都可以成為一個(gè)事件接收者,這意味著它能夠接收并處理事件。窗口小部件(widget)如QWidget、QMainWindow以及其他繼承自它們的控件都是事件接收者的例子。
四、事件過濾器
Qt允許您在事件到達(dá)接收者之前攔截和處理事件。這通過事件過濾器實(shí)現(xiàn),即在事件到達(dá)目標(biāo)對象之前先經(jīng)過另一個(gè)對象的處理。這對于全局事件處理或者對多個(gè)對象應(yīng)用相同邏輯的情況非常有用。
五、事件處理步驟
1、選擇事件接收者:
首先,您需要確定哪個(gè)對象將成為事件的接收者。通常,這是一個(gè)繼承自QWidget的窗口小部件或其他繼承自QObject的類。
2、重寫事件處理函數(shù):
根據(jù)您要處理的事件類型,在事件接收者類中找到相應(yīng)的事件處理函數(shù),并進(jìn)行重寫。每個(gè)事件類型都對應(yīng)一個(gè)特定的函數(shù),例如:keyPressEvent、mousePressEvent、paintEvent等。
3、編寫事件處理邏輯:
在事件處理函數(shù)中,您可以編寫處理特定事件的代碼邏輯。例如,在keyPressEvent中,您可以檢查按下的鍵,并根據(jù)需要執(zhí)行操作。
4、調(diào)用基類事件處理函數(shù):
如果您希望在處理完事件后將其傳遞給基類進(jìn)行進(jìn)一步處理,可以通過調(diào)用基類的事件處理函數(shù)來實(shí)現(xiàn)。這在您希望繼續(xù)保留默認(rèn)行為的情況下很有用。
六、常見三種事件處理應(yīng)用
1、重寫特定的事件處理函數(shù)
例如:mousePressEvent()
, keyPressEvent()
, paintEvent()
。 這樣的特定事件處理函數(shù)
①下面是重寫特定的keyPressEvent()
函數(shù)實(shí)現(xiàn)鍵盤上、下、左和右鍵盤的控制
void Widget::keyPressEvent(QKeyEvent *event)
{switch (event->key()) {case Qt::Key_Up:ui->label->move(ui->label->x(), ui->label->y()-4);break;case Qt::Key_Down:ui->label->move(ui->label->x(), ui->label->y()+4);break;case Qt::Key_Left:ui->label->move(ui->label->x()-4, ui->label->y());break;case Qt::Key_Right:ui->label->move(ui->label->x()+4, ui->label->y());break;default:break;}
}
②下面是重寫特定的mouseMoveEvent()
函數(shù)實(shí)現(xiàn)
//鼠標(biāo)特殊設(shè)備,必須按下任意鍵 移動(dòng)時(shí)才會產(chǎn)生鼠標(biāo)移動(dòng)事件
void Widget::mouseMoveEvent(QMouseEvent *event)
{//x():獲取當(dāng)前鼠標(biāo)在界面的x軸坐標(biāo)ui->label->move(event->x() - ui->label->width()/2, event->y() - ui->label->height()/2);
}
2、重寫所有事件的處理函數(shù)(event())
- 1、界面的產(chǎn)生的任何事件處理首先是調(diào)用基類的
event()
方法進(jìn)行處理 - 2、
event()
函數(shù)內(nèi)部,判斷事件的類型,然后迪奧用基類的特定的事件出來器進(jìn)行處理 - 3、如果是派生類重寫了特定事件處理器,則
event()
調(diào)用了派生類重寫的虛函數(shù),實(shí)現(xiàn)新功能
注意:如果派生類的重寫了event()
虛函數(shù),則界面產(chǎn)生的事件預(yù)先調(diào)用派生類重寫的event()
方法
- ①判斷自己感興趣的事件,實(shí)現(xiàn)新功能,處理完返回true
- ②不感興趣的事件,則需要手動(dòng)調(diào)用基類
QWidget
的event()
函數(shù)進(jìn)行默認(rèn)處理,返回基類處理的結(jié)果
bool Widget::event(QEvent *event)
{if(event->type() == QKeyEvent::KeyPress){//這里我們直接調(diào)用上面重寫特定好的函數(shù)實(shí)現(xiàn)鼠標(biāo)按下的事件keyPressEvent((QKeyEvent *)event);return true;}if(event->type() == QMouseEvent::MouseMove){//這里就是直接把重寫鼠標(biāo)移動(dòng)MouseMove事件邏輯的全部代碼放到里面來QMouseEvent *e = (QMouseEvent *)event;ui->label->move(e->x() - ui->label->width()/2, e->y() - ui->label->height()/2);return true;}return QWidget::event(event);
}
3、重寫(在對象上安裝)事件過濾器
事件過濾器目的是篩選出感興趣的控件上產(chǎn)生的感興趣的事件
bool QObject::eventFilter(QObject *watched, QEvent *event);
watched:感興趣的對象
event:事件
installEventFilter( const QOject *obj );
步驟:
- ①重寫eventFilter函數(shù)
- ②將關(guān)注的控件加載到安裝到當(dāng)前類的過濾器中,
installEventFilter(this);
這樣在該控件上產(chǎn)生的任何事件都優(yōu)先調(diào)用eventFilter()
,不會調(diào)用event()
bool Widget::eventFilter(QObject *watched, QEvent *event)
{//判斷該事件產(chǎn)生的對象是否感興趣的控件if(watched == ui->label_2){//再次判斷該控件上產(chǎn)生的事件是否為按興趣的事件if(event->type() == QMouseEvent::MouseButtonPress){QMouseEvent *e = (QMouseEvent *)event;if(e->button() == Qt::LeftButton){ui->label->setStyleSheet("background-color:#aa00ff;");qDebug()<<"LeftButton";}if(e->button() == Qt::MiddleButton){ui->label->setStyleSheet("background-color:#ff00ff;");qDebug()<<"MiddleButton";}if(e->button() == Qt::RightButton){ui->label->setStyleSheet("background-color:#dd000f;");qDebug()<<"RightButton";}return true;}/*該控件上不感興趣的事件,都忽略*return false;*該控件上的事件其他不該興趣的事件交給基類處理*return QWidget::eventFilter(watched, event);*/return QWidget::eventFilter(watched, event);}/**凡是不感興趣的控件上的事件,都交給基類來處理*return QWidget::eventFilter(watched, event);*/return QWidget::eventFilter(watched, event);
}
關(guān)于事件過濾器的返回值需要注意的三個(gè)點(diǎn)
①對該對象感興趣的事件執(zhí)行好后返回true
,對該對象不感興趣的事件返回false
(都忽略)
②對一個(gè)或幾個(gè)對象上的事件感興趣,其他不該興趣的事件交給基類的event()函數(shù)來處理,并返回的結(jié)果作為事件的處理結(jié)果
return QWidget::eventFilter(watched, event);
③凡是不感興趣的對象上的事件,也都交給基類來處理
return QWidget::eventFilter(watched, event);