在之前我寫過如何調用函數,當時的屬性都是手搓的,也就是自己寫成員變量、變化信號和讀寫函數,但其實有一個很便捷的方法,即使用Q_PROPERTY,下面給出標準結構:
Q_PROPERTY(數據類型 變量名 READ 變量名 WRITE set變量名 NOTIFY 變量名Changed FINAL)//FINAL 禁止子類覆蓋此屬性
這句語句也不用記,輸入Q_PROPERTY是能夠自動補全的,同時在輸入變量名時qt也會同步幫你修改后續,只能說是相當的方便。
那里面的函數怎么實現呢?甚至也不需要自己實現,在語句末尾按下alt+enter,選擇Generate Missing?Q_PROPERTY Members,qt會自動補全沒有寫的成員和函數聲明,并帶上函數實現,也屬于是一套龍服務了
這是我的代碼補全后的樣子:
//mediainfo.h...class MediaInfo : public QObject
{Q_OBJECT
public:......Q_PROPERTY(QString currenttitle READ currenttitle WRITE setCurrenttitle NOTIFY currenttitleChanged FINAL)QString currenttitle() const;void setCurrenttitle(const QString &newCurrenttitle);signals:void currenttitleChanged();private:QString m_currenttitle;
};...
//mediainfo.cpp.........void MediaInfo::getdata(const QString &file)
{......setCurrenttitle("最新標題"); //這是我在自己寫的函數中進行賦值
}QString MediaInfo::currenttitle() const
{return m_currenttitle;
}void MediaInfo::setCurrenttitle(const QString &newCurrenttitle)
{if (m_currenttitle == newCurrenttitle)return;m_currenttitle = newCurrenttitle;emit currenttitleChanged();
}
而且這樣我們就能夠通過屬性名在qml中直接訪問和綁定了
Button{...onClicked: {musicfile.open()}
}
FileDialog{id:musicfile...onAccepted: {mediasolve.getdata(selectedFile)console.log(mediasolve.currenttitle) //打印 最新標題}
}
MediaInfo{id:mediasolve
}
當然,在極其便利的反面,就是代碼可能比較冗長,可能會實現多余的函數,而且性能開銷可能會較大。但是熟練運用Q_PROPERTY仍是讓開發更加快速、便捷的實用方法~