在父widget上擺一個(gè)子widget后,當(dāng)click子widget時(shí):只會進(jìn)入到子widget的相關(guān)事件處理函數(shù)中,比如進(jìn)入到 mousePressEvent()中, 而不會進(jìn)入到父widget的對應(yīng)事件處理函數(shù)中。畢竟:click的是子widget,其遮擋住了父widget,從而父widget接收不到這個(gè)事 件。然而事實(shí)真的是這個(gè)樣子嗎? 我做了一個(gè)測試: 在一個(gè)QWidget上建了一個(gè)QLabel。而后實(shí)現(xiàn)父QWidget的mousePressEvent(), 然后跟一下發(fā)現(xiàn):當(dāng)我click這個(gè)label時(shí):居然能進(jìn)入到父QWidget的mousePressEvent()中!但是如果把子改成 QPushButton則進(jìn)入不了!
咨詢了一下別人,得到的答案是:如果子widget沒有accept或ignore該事件,則該事件會被傳遞給其父親。
事實(shí)也確實(shí)如此:
①對于QLabel: 如果不重寫mouse處理函數(shù),也沒有設(shè)置事件過濾器等操作的話,則相當(dāng)于:其對mouse這個(gè)事件一直沒有進(jìn)行處理,那沒有進(jìn)行處理的話,相當(dāng)于上邊所說的情況,此時(shí)該事件會被傳遞給其parent。
②而對于QPushButton而言:當(dāng)click它時(shí):其會發(fā)射clicked()信號,其實(shí)這就相當(dāng)于它對該事件的一個(gè)operator過程。所以:這里它accept該事件并進(jìn)行了對應(yīng)處理。從而:無法傳遞給其父窗口。
那么:對于一個(gè)繼承而來的類,只要我們重寫實(shí)現(xiàn)了其各個(gè)事件處理函數(shù),則對應(yīng)的事件肯定無法傳遞給其父widget! 哪怕重寫的該事件處理函數(shù)的函數(shù)體為空!
如果是標(biāo)準(zhǔn)的控件對象,則其肯定沒重寫各個(gè)事件處理函數(shù)。那消息能不能傳遞到父widget中,則取決于中途有沒有使用事件過濾器等將該信號攔截下來了。