淺談QT父子Widget之間消息傳遞機制
QT 父子Widget之間消息傳遞機制是本文要介紹的內(nèi)容,主要是來了解并學習QT Widget應用中消息傳遞的機制,具體內(nèi)容的實現(xiàn)來看本文詳解。
在父widget上擺一個子widget后,當click子widget時:只會進入到子widget的相關(guān)事件處理函數(shù)中,比如進入到mousePressEvent()中,而不會進入到父widget的對應事件處理函數(shù)中。畢竟:click的是子widget,其遮擋住了父widget,從而父widget接收不到這個事件。然而事實真的是這個樣子嗎?
我做了一個測試:在一個QWidget上建了一個QLabel。而后實現(xiàn)父QWidget的mousePressEvent(),然后跟一下發(fā)現(xiàn):當我click這個label時:居然能進入到父QWidget的mousePressEvent()中!但是如果把子改成QPushButton則進入不了!
咨詢了一下別人,得到的答案是:如果子widget沒有accept或ignore該事件,則該事件會被傳遞給其父親。
事實也確實如此:
1、對于QLabel:如果不重寫mouse處理函數(shù),也沒有設置事件過濾器等操作的話,則相當于:其對mouse這個事件一直沒有進行處理,那沒有進行處理的話,相當于上邊所說的情況,此時該事件會被傳遞給其parent。
2、而對于QPushButton而言:當click它時:其會發(fā)射clicked()信號,其實這就相當于它對該事件的一個operator過程。所以:這里它accept該事件并進行了對應處理。從而:無法傳遞給其父窗口。
那么:對于一個繼承而來的類,只要我們重寫實現(xiàn)了其各個事件處理函數(shù),則對應的事件肯定無法傳遞給其父widget!哪怕重寫的該事件處理函數(shù)的函數(shù)體為空!
如果是標準的控件對象,則其肯定沒重寫各個事件處理函數(shù)。那消息能不能傳遞到父widget中,則取決于中途有沒有使用事件過濾器等將該信號攔截下來了。
小結(jié):
QT 父子Widget之間消息傳遞機制的內(nèi)容介紹完了,希望通過QT Widget應用內(nèi)容的學習能對你有所幫助。