在宏的定義中 NOTIFY 后面跟該類中已經定義的一個信號函數,只要該屬性的值發生更改,就會發出該信號。這個信號函數必須采用零個或一個參數,該參數必須與屬性的類型相同。
如:
Q_PROPERTY(QString mask READ getmask WRITE setMask NOTIFY maskChanged)
這段代碼使用的 Q_PROPERTY ,其中含義為:當 mask 屬性發生變化時,將會發送 maskChanged 信號
我通過實際使用中發現,通過改變mask的變量內容,該信號並不會發出。不管是通過類內實現的修改方法,還是 QObject 類型的對象 setProperty() 去修改這個值,這個信號都不會發出。
網上查閱發現這么一個說法:這里僅是告訴元對象系統 mask 屬性改變時會發出 maskChanged 信號,但是它不是實現,具體的實現需要我們自己來完成,我們還是需要在類內相關方法下添加 emit 進行信號發送,Qt這個設計很迷。
如:
void MyPropertyClass::setMask(QString strMaskNum) { m_mask = strMaskNum; emit maskChangedXH(m_mask); }
也就是說,以下兩段代碼起到的效果是完全一樣的,不管你加不加,這個信號都需要你自己 emit :
Q_PROPERTY(QString mask READ getmask WRITE setMask NOTIFY maskChanged) //有 NOTIFY maskChanged Q_PROPERTY(QString mask READ getmask WRITE setMask) //沒有 NOTIFY maskChanged
例外:
但以下方法這個信號是會自動發出的,不用你添加相關的 emit 信號也會發出:
Q_PROPERTY(QString mask MEMBER m_mask NOTIFY maskChanged)
使用 MEMBER 注冊后,當 mask 發生改變,將會發出 maskChanged 信號
MEMBER含義為:如果一個屬性不需要 READ ,但又想使用屬性系統,可以使用MEMBER來注冊,MEMBER后面是成員變量的名字;
剛接觸Qt,很多不東西不明白,不清楚Qt這其中的緣由,等以后明白了回來補充。