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