關於 Qt 元對象屬性系統 Q_PROPERTY 中 NOTIFY 參數的信號發送問題


在宏的定義中 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這其中的緣由,等以后明白了回來補充。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM