Инструкции

Справочный раздел

В этом разделе Вы найдетё инструкции, справочники, и всевозможные хелпы по использованию программного обеспечения.

Разделы инструкций

В сети

Пользователей: 30
Из них просматривают:
Аналоги: 11. Даташиты: 4. Инструкции: 2. Новости: 5. Остальное: 2. Форум: 5. Чат: 1.
Участников: 3
Гостей: 27

an , Google , Яндекс , далее...
Рекорд 2375 человек онлайн установлен 26.12.2015.

Партнёры


Партнёры

Новые объявления

В настоящее время нет объявлений.
Оглавление

Глава 2. Философия объектной модели

Объектная модель Qt подразумевает, что всё построено на объектах. Фактически, класс QObject – основной, базовый класс. Подавляющее большинство классов Qt являются его наследниками. Классы, имеющие сигналы и слоты, должны быть унаследованы от этого класса.

Класс QObject содержит в себе поддержку:

  • сигналов и слотов;
  • таймера;
  • механизма объединения объектов в иерархии;
  • событий и механизма их фильтрации;
  • организации объектных иерархий;
  • метаобъектной информации;
  • приведение типов;
  • свойств.

Сигналы и слоты – это средства, позволяющие эффективно производить обмен информацией о событиях, вырабатываемых объектами. О них мы подробно поговорим позже в этой главе.

Поддержка таймера даёт возможность каждому из классов, унаследованных от класса QObject, не создавать дополнительно объект таймера. Тем самым экономится время на разработку. Подробнее о таймерах говорится в главе 38.

Механизм объединения объектов в иерархические структуры позволяет резко сократить временные затраты при разработке приложений, не заботясь об освобождении памяти создаваемых объектов, так как объекты-предки сами отвечают за уничтожение своих потомков.

Механизм фильтрации событий позволяет осуществить их перехват. Фильтр событий может быть установлен в любом классе, унаследованном от QObject, благодаря чему можно изменять реакцию объектов на происходящие события без изменения исходного кода класса (см. главу 15).

Метаобъектная информация включает в себя информацию о наследовании классов, что позволяет определять, являются ли классы непосредственными наследниками, а также узнать имя класса.

Для приведения типов Qt предоставляет шаблонную функцию qobject_cast<T>{}, базирующуюся на метаинформации, создаваемой метаобъектным компилятором MOC (см. главу 3), для классов, унаследованных от QObject.

Свойства – это поля, для которых обязательно должны существовать методы чтения. С их помощью можно получать доступ к атрибутам объектов извне, например из Qt Script (см. часть VII). Свойства также широко используются в визуальной среде разработки пользовательского интерфейса Qt Designer (см. главу 45). Этот механизм реализован в Qt при помощи директив процессора. Задаётся свойство при помощи макроса Q_PROPERTY. Определение свойства в общем виде выглядит следующим образом:

 

Q_PROPERTY(
        type name
        READ getFunction
        [WRITE setFunction]
        [RESET resetFunction]
        [DESIGNABLE bool]
        [SCRIPTABLE bool]
        [STOPED bool]
)

Первыми задаются тип и имя свойства, вторым – имя метода чтения (READ). Определение остальных параметров не является обязательным. Третий параметр задаёт имя метода записи (WRITE), четвёртый – имя метода сброса значения (RESET), пятый (DESIGNABLE) является логическим значением, говорящим о том, должно ли свойство появляться в инспекторе свойств Qt Designer. Шестой параметр (SCRIPTABLE) – также логическое значение, которое управляет тем, будет ли свойство доступно для языка сценариев Qt Script. Последний, седьмой параметр (STOPED) управляет сериализацией, то есть тем, будет ли свойство запоминаться во время сохранения объекта.

Итак, теперь, когда вы познакомились с понятием «свойство», давайте в качестве простого примера определим в классе свойство для управления режимом только чтение (листинг 2.2).

 

// Листинг 2.2. Определение свойства для управления резимом только чтения
class MyClass : public QObject {
Q_OBJECT
Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly)
    
private:
    bool m_bReadOnly;
public:
    MyClass(QObject* pobj = 0) : QObject(pobj), m_bReadOnly(false)
    {}
public:
    void setReadOnly(bool bReadOnly)
    {
        m_bReadOnly = bReadOnly;
    }
    bool isReadOnly() const
    {
        return m_bReadOnly;
    }
}

Класс MyClass, показанный в листинге 2.2, наследуется от QObject. Мы определяем атрибут m_bReadOnly, в котором запоминаться значения состояния. Этот атрибут инициализируется в конструкторе значением false. Для получения и изменения значения атрибута в классе MyClass определены методы isReadOnly() и setReadOnly(). Эти методы регистрируются в макросе Q_PROPERTY. Метод isReadOnly() служит для получения значения, поэтому указывается в секции READ, а метод setReadOnly() – для изменения значения, поэтому пишется в секции WRITE.

Из программы мы можем изменить значение нашего свойства следующим образом:

pobj->setProperty("readOnly", true);

А так можно получить текущее значение:

bool bReadOnly = pobj->property("readOnly").toBool();

Примечания:
  • При множественном наследовании важно помнить, что при определении класса имя класса QObject (или унаследованного от него) должно стоять первым, чтобы MOC (Meta Object Compiler, метаобъектный компилятор) мог правильно распознать его. Другой порядок приведёт к ошибке при компиляции. В листинге 2.1 приведён правильный порядок для множественного наследования.
  • При множественном наследовании также важно учитывать, что от QObject должен быть унаследован только один из базовых классов. Другими словами – нельзя производить наследование сразу от нескольких классов, наследующих QObject.
Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.

Разное

Интересно

Семь раз отмерь, один раз отрежь. И не перепутай!

Похожие инструкции