На этом шаге рассмотрим определение свойств объектов.
Свойства — это поля, для которых обязательно должны существовать методы чтения. С их помощью можно получать доступ к атрибутам объектов извне, например из языка сценариев Qt Script.
Свойства широко используются в визуальной среде разработки пользовательского интерфейса Qt Designer. Этот механизм реализован в Qt при помощи директив препроцессора.
Задается свойство при помощи макроса Q_PROPERTY. Определение свойства в общем виде выглядит следующим образом:
Q_PROPERTY(type name // тип и имя свойства READ getFunction //имя метода чтения // определение остальных параметров не является обязательным [WRITE setFunction] // имя метода записи [RESET resetFunction] //имя метода сброса значения [DESIGNABLE bool] // является логическим значением, // говорящим о том, должно ли свойство появляться // в инспекторе свойств Qt Designer [SCRIPTABLE bool] // логическое значение, // которое управляет тем, будет ли свойство // доступно для языка сценариев Qt Script [STORED bool] //управляет сериализацией, // т. е. тем, будет ли свойство запоминаться // во время сохранения объекта )
Рассмотрим простой пример - определим в классе свойство для управления режимом только чтения.
class MyClass : public QObject // класс MyClass, //наследуется от класса QObject { Q_OBJECT Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly) private: bool m_bReadOnly; //определяем атрибут m_bReadOnly, // в котором будут запоминаться значения состояния public: MyClass(QObject* pobj = 0) : QObject(pobj) , m_bReadOnly(false) // атрибут m_bReadOnly инициализируется // в конструкторе значением false { } public: // Для получения и изменения значения атрибута в классе MyClass // определены методы isReadOnly() и setReadOnly(). // Эти методы регистрируются в макросе Q_PROPERTY. // Метод isReadOnly() служит для получения значения, // поэтому указывается в секции READ, // а метод setReadOnly() — для изменения значения, // поэтому пишется в секции WRITE. void setReadOnly(bool bReadOnly) { m_bReadOnly = bReadOnly; } bool isReadOnly() const { return m_bReadOnly; } }
Из программы можно изменить значение свойства readOnly следующим образом:
pobj->setProperty("readOnly", true);
А так можно получить текущее значение свойства readOnly:
bool bReadOnly = pobj->property("readOnly").toBool();
На следующем шаге рассмотрим механизм сигналов и слотов.