日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QEvent的accept()和ignore()函数功能

發布時間:2023/12/18 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QEvent的accept()和ignore()函数功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

QEvent的accept()和ignore()一般不會用到,因為不如直接調用QWidget類的事件處理函數直接,而且作用是一樣的,見下面的例子。

推薦直接調用QWidget的事件處理函數。而不是調用accept()和ignore()。

只有一種情況下,必須使用調用accept()和ignore(),那就是closeEvent(),在closeEvent()的事件處理函數中,必須調用accept()和ignore()。即如果想窗口被關閉,那么必須顯示調用event->accept();如果不想關閉窗口,必須顯示調用ignore(),否則窗口默認會關閉。

本章內容也是關于Qt事件。或許這一章不能有一個完整的例子,因為對于事件總是感覺很抽象,還是從底層上理解一下比較好的吧!

前面說到了事件的作用,下面來看看我們如何來接收事件。回憶一下前面的代碼,我們在子類中重寫了事件函數,以便讓這些子類按照我們的需要完成某些功能,就像下面的代碼:

void?MyLabel::mousePressEvent(QMouseEvent *event)
{
????????if(event->button() == Qt::LeftButton) {
????????????????// do something
????????}else?{
????????????????QLabel::mousePressEvent(event);
????????}
}
上面的代碼和前面類似,在鼠標按下的事件中檢測,如果按下的是左鍵,做我們的處理工作,如果不是左鍵,則調用父類的函數。這在某種程度上說,是把事件向上傳遞給父類去響應,也就是說,我們在子類中“忽略”了這個事件。

比如上面的例子,eventLabel忽略了這個事件,那么這個事件就會被繼續傳遞下去,實際上是傳遞給了eventLabel的父組件,QLabel,

accept()接收,表面eventLabel會處理這個事件,那么這個事件就不會再繼續傳遞下去,那么QLabel就不會再收到這個事件,
我們可以把Qt的事件傳遞看成鏈狀:如果子類沒有處理這個事件,就會繼續向其他類傳遞。

其實,Qt的事件對象都有一個accept()函數和ignore()函數。正如它們的名字,前者用來告訴Qt,事件處理函數“接收”了這個事件,不要再傳遞;后者則告訴Qt,事件處理函數“忽略”了這個事件,需要繼續傳遞,尋找另外的接受者。在事件處理函數中,可以使用isAccepted()來查詢這個事件是不是已經被接收了。
事實上,我們很少使用accept()和ignore()函數,而是想上面的示例一樣,如果希望忽略事件,只要調用父類的響應函數即可。(其實作用是一樣的)

為什么要這么做呢?因為我們無法確認父類中的這個處理函數沒有操作,如果我們在子類中直接忽略事件,Qt不會再去尋找其他的接受者,那么父類的操作也就不能進行,這可能會有潛在的危險。

另外我們查看一下QWidget的mousePressEvent()函數的實現:

void?QWidget::mousePressEvent(QMouseEvent *event)
{
????????event->ignore();//QWidget 會忽略這個事件,
????????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();
????????????????}
????????}
}
請注意第一條語句,如果所有子類(比如EventLabel類,)都沒有重寫mousePressEvent函數,這個事件會在這里被忽略掉,這暗示著這個組件(eventLabel)不關心這個事件,這個事件就可能被傳遞給其父組件。
不過,事情也不是絕對的。在一個情形下,我們必須使用accept()和ignore()函數,那就是在窗口關閉的時候。這個必須明確顯示的調用accept()和ignore(),

在closeEvent()事件處理函數中,accept()是關閉窗口,ignore()是不關閉窗口,只有在closeEvent()中才是這樣,

如果你在窗口關閉時需要有個詢問對話框,那么就需要這么去寫:

closeEvent事件的默認槽函數是QWidget類的CloseEvent()函數,該函數中,會關閉掉當前的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;
????????}
}


這樣,我們經過詢問之后才能正常退出程序。

總結

以上是生活随笔為你收集整理的QEvent的accept()和ignore()函数功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。