2014-02-23 102 views
12

我無法理解Q_PROPERTY的用法。 Q_PROPERTY如何幫助制定計劃防禦?它是幹什麼用的?我看過論壇,但實際上無法做到它的應用。我已經理解了這個例子,但不是它的用法。Q_PROPERTY在Qt中有什麼意義?

下面是一個例子,我能從中獲得什麼。我明白閱讀只會給讀者一種特權。

write屬性將賦予只寫權限。但是它的需求是什麼?有人可以舉例說明嗎?

class MyClass : public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged) 
    Q_ENUMS(Priority) 

public: 
    MyClass(QObject *parent = 0); 
    ~MyClass(); 

    enum Priority { High, Low, VeryHigh, VeryLow }; 

    void setPriority(Priority priority) 
    { 
     m_priority = priority; 
     emit priorityChanged(priority); 
    } 
    Priority priority() const 
    { return m_priority; } 

signals: 
    void priorityChanged(Priority); 

private: 
    Priority m_priority; 
}; 

回答

7

它具有以下優點:

  • 它可用於元對象系統,因此它可以被內省,從QML等使用

  • 它具有比其它選項只是讀寫。查看通知,重置等等。將它們集成到QtCreator(設計器)也更容易。

  • 您不需要在常見的讀寫情況下使用Qt 5.1開始編寫樣板文件,因爲它們將爲您生成。

+0

關於第一點,如果我們已經生成了一個接口,它可以被內省。沒有必要在那裏指定屬性。關於QML,如果我們聲明瞭Q_INVOKABLE或SLOT,那麼它可以由QML調用。 QProperty如何影響到那裏?第二點,我同意它可以做更多。第三點,我不明白。 –

+0

@SHREYASJOSHI:槽通常用於無效返回值。對於每種方法,Q_INVOKABLE將是單調乏味的。此外,內省不僅僅是從QML中使用它,而且即使你可以這樣做,你也不會將它用作來自QML的真實屬性,而是函數調用。這會很煩人。第三點:編寫自己的getter/setter時,通常是相同的樣板文件是沒有意義的。 Qt 5會自動爲您生成。 – lpapp

+3

+1 for *「不需要在普通讀寫情況下用Qt 5編寫樣板」*,不知道它。但是你有鏈接記錄嗎? (我找不到任何有關這方面的信息,例如[here](http://qt-project.org/doc/qt-5.0/qtcore/properties.html)。) – hyde