2014-02-23 69 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