QEvent的accept()和ignore()函数功能
QEvent的accept()和ignore()一般不會(huì)用到,因?yàn)椴蝗缰苯诱{(diào)用QWidget類的事件處理函數(shù)直接,而且作用是一樣的,見下面的例子。
推薦直接調(diào)用QWidget的事件處理函數(shù)。而不是調(diào)用accept()和ignore()。
只有一種情況下,必須使用調(diào)用accept()和ignore(),那就是closeEvent(),在closeEvent()的事件處理函數(shù)中,必須調(diào)用accept()和ignore()。即如果想窗口被關(guān)閉,那么必須顯示調(diào)用event->accept();如果不想關(guān)閉窗口,必須顯示調(diào)用ignore(),否則窗口默認(rèn)會(huì)關(guān)閉。
本章內(nèi)容也是關(guān)于Qt事件?;蛟S這一章不能有一個(gè)完整的例子,因?yàn)閷?duì)于事件總是感覺很抽象,還是從底層上理解一下比較好的吧!
前面說到了事件的作用,下面來看看我們?nèi)绾蝸斫邮帐录??;貞浺幌虑懊娴拇a,我們?cè)谧宇愔兄貙懥耸录瘮?shù),以便讓這些子類按照我們的需要完成某些功能,就像下面的代碼:
void?MyLabel::mousePressEvent(QMouseEvent *event)
{
????????if(event->button() == Qt::LeftButton) {
????????????????// do something
????????}else?{
????????????????QLabel::mousePressEvent(event);
????????}
}
上面的代碼和前面類似,在鼠標(biāo)按下的事件中檢測,如果按下的是左鍵,做我們的處理工作,如果不是左鍵,則調(diào)用父類的函數(shù)。這在某種程度上說,是把事件向上傳遞給父類去響應(yīng),也就是說,我們?cè)谧宇愔小昂雎浴绷诉@個(gè)事件。
比如上面的例子,eventLabel忽略了這個(gè)事件,那么這個(gè)事件就會(huì)被繼續(xù)傳遞下去,實(shí)際上是傳遞給了eventLabel的父組件,QLabel,
accept()接收,表面eventLabel會(huì)處理這個(gè)事件,那么這個(gè)事件就不會(huì)再繼續(xù)傳遞下去,那么QLabel就不會(huì)再收到這個(gè)事件,
我們可以把Qt的事件傳遞看成鏈狀:如果子類沒有處理這個(gè)事件,就會(huì)繼續(xù)向其他類傳遞。
其實(shí),Qt的事件對(duì)象都有一個(gè)accept()函數(shù)和ignore()函數(shù)。正如它們的名字,前者用來告訴Qt,事件處理函數(shù)“接收”了這個(gè)事件,不要再傳遞;后者則告訴Qt,事件處理函數(shù)“忽略”了這個(gè)事件,需要繼續(xù)傳遞,尋找另外的接受者。在事件處理函數(shù)中,可以使用isAccepted()來查詢這個(gè)事件是不是已經(jīng)被接收了。
事實(shí)上,我們很少使用accept()和ignore()函數(shù),而是想上面的示例一樣,如果希望忽略事件,只要調(diào)用父類的響應(yīng)函數(shù)即可。(其實(shí)作用是一樣的)
為什么要這么做呢?因?yàn)槲覀儫o法確認(rèn)父類中的這個(gè)處理函數(shù)沒有操作,如果我們?cè)谧宇愔兄苯雍雎允录?#xff0c;Qt不會(huì)再去尋找其他的接受者,那么父類的操作也就不能進(jìn)行,這可能會(huì)有潛在的危險(xiǎn)。
另外我們查看一下QWidget的mousePressEvent()函數(shù)的實(shí)現(xiàn):
void?QWidget::mousePressEvent(QMouseEvent *event)
{
????????event->ignore();//QWidget 會(huì)忽略這個(gè)事件,
????????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)注意第一條語句,如果所有子類(比如EventLabel類,)都沒有重寫mousePressEvent函數(shù),這個(gè)事件會(huì)在這里被忽略掉,這暗示著這個(gè)組件(eventLabel)不關(guān)心這個(gè)事件,這個(gè)事件就可能被傳遞給其父組件。
不過,事情也不是絕對(duì)的。在一個(gè)情形下,我們必須使用accept()和ignore()函數(shù),那就是在窗口關(guān)閉的時(shí)候。這個(gè)必須明確顯示的調(diào)用accept()和ignore(),
在closeEvent()事件處理函數(shù)中,accept()是關(guān)閉窗口,ignore()是不關(guān)閉窗口,只有在closeEvent()中才是這樣,
如果你在窗口關(guān)閉時(shí)需要有個(gè)詢問對(duì)話框,那么就需要這么去寫:
closeEvent事件的默認(rèn)槽函數(shù)是QWidget類的CloseEvent()函數(shù),該函數(shù)中,會(huì)關(guān)閉掉當(dāng)前的widget,
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) {
????????????????returntrue;
????????}else?{
????????????????return?false;
????????}
}
這樣,我們經(jīng)過詢問之后才能正常退出程序。
總結(jié)
以上是生活随笔為你收集整理的QEvent的accept()和ignore()函数功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: insertSelective 和 in
- 下一篇: JS 中去除空格和换行的正则表达式写法