W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
本章內(nèi)容也是關(guān)于 Qt 事件?;蛟S這一章不能有一個(gè)完整的例子,因?yàn)閷?duì)于事件總是感覺很抽象,還是從底層上理解一下比較好的吧!
前面說(shuō)到了事件的作用,下面來(lái)看看我們?nèi)绾蝸?lái)接收事件。回憶一下前面的代碼,我們?cè)谧宇愔兄貙懥耸录瘮?shù),以便讓這些子類按照我們的需要完成某些功能,就像下面的代碼:
void MyLabel::mousePressEvent(QMouseEvent * event)
{
if(event->button() == Qt::LeftButton) {
// do something
} else {
QLabel::mousePressEvent(event);
}
}
上面的代碼和前面類似,在鼠標(biāo)按下的事件中檢測(cè),如果按下的是左鍵,做我們的處理工作,如果不是左鍵,則調(diào)用父類的函數(shù)。這在某種程度上說(shuō),是把事件向上傳遞給父類去響應(yīng),也就是說(shuō),我們?cè)谧宇愔小昂雎浴绷诉@個(gè)事件。
我們可以把 Qt 的事件傳遞看成鏈狀:如果子類沒有處理這個(gè)事件,就會(huì)繼續(xù)向其他類傳遞。其實(shí),Qt的事件對(duì)象都有一個(gè) accept()函數(shù)和 ignore()函數(shù)。正如它們的名字,前者用來(lái)告訴 Qt,事件處理函數(shù)“接收”了這個(gè)事件,不要再傳遞;后者則告訴 Qt,事件處理函數(shù)“忽略”了這個(gè)事件,需要繼續(xù)傳遞,尋找另外的接受者。在事件處理函數(shù)中,可以使用 isAccepted()來(lái)查詢這個(gè)事件是不是已經(jīng)被接收了。
事實(shí)上,我們很少使用 accept()和 ignore()函數(shù),而是想上面的示例一樣,如果希望忽略事件,只要調(diào)用父類的響應(yīng)函數(shù)即可。記得我們?cè)?jīng)說(shuō)過(guò),Qt 中的事件大部分是 protected 的,因此,重寫的函數(shù)必定存在著其父類中的響應(yīng)函數(shù),這個(gè)方法是可行的。為什么要這么做呢?因?yàn)槲覀儫o(wú)法確認(rèn)父類中的這個(gè)處理函數(shù)沒有操作,如果我們?cè)谧宇愔兄苯雍雎允录?,Qt 不會(huì)再去尋找其他的接受者,那么父類的操作也就不能進(jìn)行,這可能會(huì)有潛在的危險(xiǎn)。另外我們查看一下 QWidget 的 mousePressEvent()函數(shù)的實(shí)現(xiàn):
void QWidget::mousePressEvent(QMouseEvent *event)
{
event->ignore();
if ((windowType() == Qt::Popup)) {
event->accept();
QWidget* w;
while ((w = qApp->activePopupWidget()) && w != this){
w->close();
if (qApp->activePopupWidget() == w) // widget does not want to dissappear
w->hide(); // hide at least
}
if (!rect().contains(event->pos())){
close();
}
}
}
請(qǐng)注意第一條語(yǔ)句,如果所有子類都沒有覆蓋 mousePressEvent 函數(shù),這個(gè)事件會(huì)在這里被忽略掉,這暗示著這個(gè)組件不關(guān)心這個(gè)事件,這個(gè)事件就可能被傳遞給其父組件。
不過(guò),事情也不是絕對(duì)的。在一個(gè)情形下,我們必須使用 accept()和 ignore()函數(shù),那就是在窗口關(guān)閉的時(shí)候。如果你在窗口關(guān)閉時(shí)需要有個(gè)詢問對(duì)話框,那么就需要這么去寫:
void MainWindow::closeEvent(QCloseEvent * event)
{
if(continueToClose()) {
event->accept();
} else {
event->ignore();
}
}
bool MainWindow::continueToClose()
{
if(QMessageBox::question(this,
tr("Quit"),
tr("Are you sure to quit this application?"),
QMessageBox::Yes | QMessageBox::No,
QMessageBox::No)
== QMessageBox::Yes) {
return true;
} else {
return false;
}
}
這樣,我們經(jīng)過(guò)詢問之后才能正常退出程序。
本文出自 “豆子空間” 博客,請(qǐng)務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/194031
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: