Объектная модель Qt
Объектная модель стандартного C++ предоставляет весьма эффективную поддержку объектной парадигмы во время исполнения. Но из-за ее статической природы она является негибкой в некоторых проблемных областях. Программирование графического интерфейса пользователя является областью, требующей как эффективности во время исполнения, так и высокого уровня гибкости. Qt предоставляет и то, и другое, объединяя скорость C++ и гибкость объектной модели Qt.
Qt добавляет к C++ следующие возможности:
- очень мощный механизм для непрерывного взаимодействия объектов, называемый сигналы и слоты
- свойства объектов, проектируемые и пригодные для использования в очередях
- мощные события и фильтры событий
- контекстный перевод строк для интернационализации
- изощренные управляемые интервалами таймеры, которые делают возможным элегантную интеграцию многих задач в графический интерфейс пользователя, управляемый событиями
- иерархические и пригодные для использования в очередях деревья объектов, организующие владение объектом естественным способом
- защищенные указатели (guarded pointers) (QPointer), автоматически устанавливаемые в 0 при уничтожении объекта, на который они ссылаются, в отличие от обычных указателей C++, которые становятся провисшими указателями (dangling pointers) после уничтожения объектов, на которые они ссылались
- динамическое приведение (dynamic cast), которое работает через границы библиотек.
Многие из этих возможностей Qt реализованы с помощью стандартных приемов C++, базирующихся на наследовании от QObject. Остальным, подобно механизму связи между объектами и системе динамических свойств, требуется Система мета-объектов, предоставляемая собственным Компилятором мета-объектов (moc) Qt.
Система мета-объектов - это расширение C++, делающее язык более пригодным для подлинного компонентного программирования графического интерфейса пользователя. Несмотря на то, что для расширения C++ можно использовать шаблоны, система мета-объектов предоставляет преимущества использования стандартного C++, чего нельзя добиться с помощью шаблонов; смотрите Почему в Qt не используются шаблоны в сигналах и слотах?
Объекты Qt: ссылочный тип (Identity) или тип значений (Value)
Некоторые из добавленных возможностей объектной модели Qt, перечисленных выше, требуют чтобы мы думали об Объектах Qt как о ссылочном типе (identities), а не типе значений (values). Типы значений копируются или присваиваются; ссылочные типы - клонируются. Клонирование означает создание нового ссылочного типа, а не точной копии старого. Например, двойники (twins) имеют различные ссылочные типы. Они могут выглядеть одинаковыми, но они имеют разные имена, разное расположение и могут иметь совершенно разные сети связей (social networks).
Следовательно, клонирование ссылочного типа (identity) более сложная операция, чем копирование или присвоение типа значения (value). Мы можем увидеть, что это значит в объектной модели Qt.
Объект Qt...
- может иметь уникальное имя QObject::objectName(). Если мы скопируем Объект Qt, какое имя мы должны будем дать копии?
- располагается в иерархии объектов. Если мы скопируем Объект Qt, где будет находиться копия?
- может быть соединен с другими Объектами Qt, чтобы направлять им сигналы или получить испущенные ими сигналы. Если мы скопируем Объект Qt, как мы сможем перенести эти соединения на копию?
- может иметь новые свойства, добавленные во время выполнения и которые не были объявлены в классе C++. Если мы скопируем Объект Qt, будет ли копия включать в себя свойства, которые были добавлены в оригинал?
По этим причинам Объекты Qt должны рассматриваться как ссылочный тип (identities), а не как тип значений (values). Ссылочные типы клонируются, а не копируются или присваиваются, а клонирование ссылочного типа является более сложной операцией, чем копирование или присваивание типа значений. Поэтому у QObject и всех подклассов QObject (прямых или непрямых) конструкторы копирования и операторы присваивания заблокированы.
|