Head hunter — Применение СС++ и Qt


Содержание

Выбор между Qt и С#

12.05.2014, 15:48

Выбор между двумя ПК
Помогите выбрать, какой ПК будет лучше для игр? 1.Процессор: AMD X6 FX-6100 3.3ГГц AM3+.

Выбор между 2-мя сборками
Всем привет! У меня встал выбор между 2-мя сборками. Одинаковые комплектующие: процессор.

Выбор между процессорами
Я уже понял что АМД мне не подходит. Вот только теперь не могу выбрать между 2 интелами -ntel.

Выбор между двумя
И снова я, MSI GT70 0ND-631RU http://www.notik.ru/goods/22776.htm MSI GT70 0ND-627RU.

Выбор ноутбука между
Здравствуйте! Выбираю ноутбук на замену стационарному компьютеру. На нем хотелось бы поиграть.

12.05.2014, 15:53 2 12.05.2014, 15:59 3 12.05.2014, 16:03 4
12.05.2014, 16:03
12.05.2014, 16:20 5
12.05.2014, 16:54 6
13.05.2014, 21:13 7
13.05.2014, 21:57 8

тут я соглашусь, MFC действительно устаревшая, да и особо не оправдавшая себя сборная солянка классов.

Добавлено через 5 минут
Я вообще на Qt смотрю исключительно в качестве удобного фреймворка под сборку Windows / Linux . Т.к. есть у меня лёгкая сомнительная мысль, что если продаёшь своё ПО под Linux на, допустим, платёжные терминалы (столбы, где бабло на телефон кладут), то возможно будет профит для клиента, в плане того, что Linux — бесплатная, а Windows, пусть даже XP — платная. Тоесть если у клиента терминалов штук. ну 5000 — бабла он сэкономит на старте бизнеса на бесплатной ОС. Ну это я так, пример просто привёл, т.к. обычно на таких терминалах как раз WinXP или Windows Ebdeded

Часть 1. Введение. Инструменты разработчика и объектная модель

Серия контента:

Этот контент является частью # из серии # статей: Программирование с Qt

Этот контент является частью серии: Программирование с Qt

Следите за выходом новых статей этой серии.

1. Введение

Существуют версии Qt для unix-подобных операционных систем с X Window System (например, X.Org (EN), Mac OS X и ОС Windows). Также Qt Software портирует свой продукт на мобильные платформы: Embedded Linux (EN), S60 (EN) и Windows CE. Qt предоставляет большие возможности кросс-платформенной разработки самых разных программ, не обязательно с графическим интерфейсом. На нем, в частности, основана популярная среда рабочего стола KDE (EN).

Инструментарий разбит на модули, каждый из которых размещается в отдельной библиотеке. Базовые классы находятся в QtCore , компоненты графических интерфейсов – в QtGui , классы для работы с сетью – в QtNetwork и т.д. Таким образом, можно собирать программы даже для платформ, где нет X11 или другой совместимой графической подсистемы.

2. Установка Qt

Нам потребуется установить среду разработки Qt. Программное обеспечение распространяется на условиях свободной лицензии GPL 3.0 или LGPL 2.1. Его можно получить по адресу http://www.qtsoftware.com/downloads (EN).

2.1. Базовые библиотеки и инструменты

В репозиториях популярных дистрибутивов GNU/Linux уже есть готовые пакеты со средой разработки Qt (например, в Debian, Fedora, Gentoo, Mandriva, Ubuntu). Тем не менее, пользователь может собрать и установить инструментарий из исходных текстов.

Для систем, использующих X11, необходимо загрузить файл qt-x11-opensource-src-4.x.y.tar.gz , где 4.x.y – последняя доступная версия из стабильных. Мы будем устанавливать версию 4.5.0.

В директории с файлом qt-x11-opensource-src-4.5.0.tar.gz выполните следующие команды:

Прежде чем собирать Qt, запустите скрипт configure . Полный набор его опций выдается по команде ./configure -help , но обычно можно использовать типовые настройки.

Параметр -prefix задает каталог для установки (по умолчанию используется /usr/local/Trolltech/Qt-4.5.0 ). Также имеются ключи для инсталляции различных компонентов (исполняемых файлов, библиотек, документации, и т.д.) в разные директории.

При запуске скрипт требует подтвердить согласие пользователя с условиями лицензии GPL / LGPL. После выполнения

можно запустить сборку и установку при помощи команд:

Имейте в виду, что компиляция занимает много времени, а для установки Qt могут потребоваться права суперпользователя (файлы записываются в /usr/local/ ).

Если в дальнейшем вам понадобится в той же директории заново сконфигурировать и пересобрать Qt, удалите все следы предыдущей конфигурации при помощи make confclean , прежде чем снова запускать ./configure .

Путь к исполняемым файлам Qt нужно добавить в переменную окружения PATH. В оболочках bash, ksh, zsh и sh это можно сделать, дописав в файл

/.profile следующие строки:

В csh и tcsh нужно дописать в

Если вы используете другую оболочку, то обратитесь к соответствующим разделам документации.

Кроме того, необходимо добавить строку /usr/local/Trolltech/Qt-4.5.0/lib в переменную LD_LIBRARY_PATH , если компилятор не поддерживает RPATH. Мы используем GNU/Linux и GCC (EN), поэтому пропускаем этот шаг.

Затем с помощью утилиты qtdemo запустите демонстрационные приложения для проверки работоспособности установленного инструментария.

2.2. SDK

Недавно появилась кросс-платформенная среда разработки Qt Creator. На сайте Qt Software можно найти полный SDK, включающий IDE (помимо библиотек и основных средств разработчика). Загрузите бинарный файл qt-sdk-linux-x86-opensource-xxx.bin и запустите мастер установки:

Если не собираетесь устанавливать SDK в домашнюю директорию, то запускайте инсталлятор с правами суперпользователя.

Рисунок 1. Установка Qt SDK

3. Инструменты разработчика

В состав Qt включены инструменты разработчика с графическим или консольным интерфейсом. В их числе:

  • assistant – графическое средство для просмотра гипертекстовой документации по инструментарию и библиотекам Qt.
  • designer – графическое средство для создания и сборки пользовательских интерфейсов на основе компонентов Qt.
  • qmake – кросс-платформенный генератор Makefile.
  • moc – компилятор метаобъектов (обработчик расширений Qt для C++).
  • uic – компилятор пользовательских интерфейсов из файлов .ui, созданных в Qt Designer.
  • rcc – компилятор ресурсов из файлов .qrc.
  • qtconfig – графическое средство установки пользовательских настроек для приложений Qt.
  • qtdemo – запуск примеров и демонстрационных программ.
  • qt3to4 – средство переноса проектов с Qt 3 на Qt 4.
  • linguist – средство для локализации приложений.
  • pixeltool – экранная лупа.
Рисунок 2. Qt Assistant
Рисунок 3. qtdemo

3.1. qmake

Утилита qmake используется для автоматического генерирования Makefile на различных платформах.

В целом qmake ориентируется на Qt. Если вас интересуют кросс-платформенные системы сборки более широкого назначения, то можете обратиться к CMake, которая также поддерживает Qt.

Новичкам стоит остановиться на qmake.

Полную документацию по этой утилите вы можете найти в Qt Assistant. Также с Qt поставляются страницы руководства, в том числе qmake(1) (наберите в командной строке man qmake ). Здесь мы приведем основные указания, которые помогут вам собирать код примеров статьи, а также свои простые проекты.

В качестве примера создадим директорию myproject и добавим туда файлы hello.h, hello.cpp и main.cpp . В hello.h опишем прототип функции hello():

Листинг 1.1. Объявления функций программы «Hello, World!»

Реализацию hello() поместим в hello.cpp:

Листинг 1.2. Реализации функций программы «Hello, World!»

Здесь qDebug() используется для вывода отладочной информации. Ее можно убрать, объявив при компиляции символ QT_NO_DEBUG_OUTPUT . Также имеется функция qWarning() , выдающая предупреждения, и qFatal() , завершающая работу приложения после вывода сообщения о критической ошибке в STDERR (то же самое, но без завершения работы, делает qCritical() ).

В заголовочном файле содержатся объявления, добавляющие для qDebug(), qWarning() и qCritical() более удобный синтаксис оператора . При этом между аргументами (как в случае qDebug() ) автоматически расставляются пробелы, поддерживается вывод многих типов C++ и Qt, а в конце автоматически добавляется перевод строки.

Код основного приложения (здесь мы следуем соглашению, по которому main() помещается в файл main.cpp ):

Листинг 1.3. Функция main() программы «Hello, World!»

Чтобы создать файл проекта, запустите

После этого должен появиться файл myproject.pro примерно такого содержания:

Оператор = используется для присвоения значений переменным, += добавляет новую опцию к переменной, -= удаляет указанную опцию.

TEMPLATE = app обозначает, что мы собираем приложение; для библиотеки используется TEMPLATE = lib .

TARGET – имя целевого файла (укажите TARGET = foobar , чтобы получить исполняемый файл foobar ).

DEPENDPATH – директории для поиска при разрешении зависимостей.

INCLUDEPATH – директории с заголовочными файлами.

на основе myproject.pro в GNU/Linux будет создан обычный Makefile :

Опции qmake влияют на содержимое Makefile. Например, qmake -Wall добавит к флагам компилятора -Wall – вывод всех предупреждений.

По команде make мы получим исполняемый файл myproject , который выводит на экран строку «Hello, World!».

Эта схема может показаться слишком сложной, но в реальных проектах qmake берет на себя большую часть работы по сборке (например, запускает компилятор метаобъектов).

3.2. Qt Creator

Описанных выше инструментов достаточно для разработки приложений. Вы можете использовать любимый текстовый редактор, например GNU Emacs или Vim. С Qt работают также традиционные IDE, такие как KDevelop.

Однако не так давно Qt Software выпустила свою кросс-платформенную IDE Qt Creator. В неё встроены все инструменты разработчика, имеется редактор с подсветкой и дополнением кода, отладчик (графический интерфейс для gdb ), а также реализована поддержка Perforce, SVN и Git.

При работе в Qt Creator используется несколько режимов, которым соответствуют вкладки на панели слева. Для быстрого переключения между режимами можно использовать комбинации клавиш Ctrl+1, Ctrl+2 , и т.д. Основному режиму редактирования соответствует Ctrl+2 .

Рисунок 4. Qt Creator

Для навигации в редакторе применяется комбинация клавиш Ctrl+K . После ее нажатия нужно указать один из префиксов:

Таблица 1. Префиксы для навигации в Qt Creator

l Строка в текущем документе
m Методы
c Классы
: Классы и методы
? Предметный указатель справки
f Файлы на диске
a Файлы во всех проектах
p Файлы в текущем проекте

После префикса нажмите пробел и введите соответствующую информацию. Например, для перехода на строку 93 текущего файла нужно напечатать » l 93 » (то же самое можно сделать при помощи Ctrl+L ), для перехода к документации по теме qobject_cast – «? qobject_cast» и т.д.

В нижней части окна при этом отображается поле с автоматическим дополнением.

Рисунок 5. Поле для навигации в Qt Creator


Таблица 2. Комбинации клавиш для редактора Qt Creator

Ctrl+[ Перейти к началу блока
Ctrl+] Перейти к концу блока
Ctrl+U Выделить блок
Ctrl+Shift+U Снять выделение блока
Ctrl+I Выровнять блок
Ctrl+ Развернуть блок
Ctrl+/ Закомментировать блок
Ctrl+Shift+↑ Переместить строку вверх
Ctrl+Shift+↓ Переместить строку вниз
hift+Del SУдалить строку

Во встроенном редакторе реализовано «умное» дополнение кода, вызываемое комбинацией клавиш Ctrl+ . База символов составляется на основе заголовочных файлов проекта из INCLUDEPATH .

Рисунок 6. Дополнение кода в Qt Creator

Для чтения документации в IDE предусмотрен отдельный режим справки. Чтобы получить контекстную помощь по классу или методу, просто передвиньте текстовый курсор к имени и нажмите F1 . Также полезна клавиша F2 , перемещающая к определению в заголовочных файлах.

Чтобы переключиться из режима справки или отладки в основной режим редактирования, нажмите Esc . В режиме редактирования Esc переводит фокус из дополнительных окон (например, вывода компиляции или контекстной справки) на редактор. Если нажать Esc еще раз, то дополнительные окна закрываются.

Как и qmake , Qt Creator использует файлы в формате .pro , поэтому в IDE легко импортируются старые проекты, созданные вручную. Также доступен мастер, при помощи которого можно создать заготовку нового проекта.

Сейчас Qt Creator активно разрабатывается, но если вам нужна классическая IDE для Qt, работающая на различных платформах, то это лучший вариант.

4. Стиль Qt

В Qt используется CamelCasing: имена классов выглядят как MyClassName , а имена методов – как myMethodName .

При этом имена всех классов Qt начинаются с Q , например QObject, QList или QFont .

Большинству классов соответствуют заголовочные файлы с тем же именем (без расширения .h ), т.е. нужно использовать:

Поэтому в дальнейшем мы не будем отдельно оговаривать, где объявлен тот или иной класс.

Методы для получения и установки свойств (getter и setter) именуются следующим образом: свойство fooBar можно получить при помощи метода fooBar() и установить при помощи setFooBar() .

При разработке собственных приложений на Qt стоит придерживаться этого стиля.

5. Объектная модель

Для эффективной работы с классами на стадии выполнения в Qt используется специальная объектная модель, расширяющая модель C++. В частности, добавляются следующие возможности:

  • древовидные иерархии объектов;
  • аналог dynamic_cast для библиотеки, не использующий RTTI;
  • взаимодействие объектов через сигналы и слоты;
  • свойства объектов.

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

В тех случаях, когда объект требовалось бы рассматривать не как сущность, а как значение (например, при хранении в контейнере) – используются указатели. Иногда указатель на объект, наследуемый от QObject , называют просто объектом.

Инструментарий спроектирован так, что для QObject и всех его потомков конструктор копирования и оператор присваивания недоступны – они объявлены в разделе private через макрос Q_DISABLE_COPY() :

Будьте внимательны и не используйте конструкцию

Foo bar = Foo (baz);

Другие объекты (например, контейнеры и строки) полностью определяются представляемыми данными, поэтому в соответствующих классах имеются операция присваивания и конструктор копирования. Кроме того, объекты, представляющие одинаковые данные, могут прозрачно для программиста разделять их в памяти.

Рисунок 7. Некоторые классы Qt.

5.1. Система метаобъектов

Часть расширений реализована стандартными методами C++, однако Qt использует и более сложные синтаксические расширения, поэтому он использует автоматическую генерацию кода.

Для этого в C++ реализован механизм шаблонов, но он не предоставляет всех необходимых Qt возможностей, плохо совместим с динамической объектной моделью и в полной мере не поддерживается всеми версиями компиляторов.

В сложных ситуациях Qt использует свой компилятор метаобъектов moc , преобразующий код с расширениями в стандартный код C++. Для обозначения того, что класс использует метаобъектные возможности (и, соответственно, должен обрабатываться moc ), в разделе private нужно указать макрос Q_OBJECT .

Если вы встречаете странные ошибки компиляции, сообщающие, что у класса не определен конструктор, либо у него нет таблицы виртуальных функций ( vtbl ), скорее всего вы забыли код, генерируемый moc. Обычно это происходит, если не указан макрос Q_OBJECT .

Во избежание ошибок Q_OBJECT лучше использовать во всех классах, наследуемых от QObject (косвенно либо напрямую).

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

В числе прочих, метаобъектный код добавляет метод

virtual const QMetaObject* QObject::metaObject() const;

который возвращает указатель на метаобъект объекта.

На системе метаобъектов основаны сигналы, слоты и свойства.

При наследовании от QObject помните об ограничениях, налагаемых moc :

  1. При множественном наследовании потомком QObject должен быть первый и только первый наследуемый класс:
  2. Виртуальное наследование с QObject не поддерживается.

5.2. qobject_cast

Для динамического приведения QObject используется функция

T qobject_cast (QObject *object);

Она работает как стандартная операция dynamic_cast в C++, но не требует поддержки со стороны системы динамической идентификации типов (RTTI).

Пусть у нас имеется класс MyClass1 , наследующий от QObject и MyClass2 , наследующий от MyClass1 :

Динамическое приведение иллюстрирует следующий код:

Эти операции сработают корректно на стадии выполнения.

Как и в случае с dynamic_cast , результат приведения можно проверить:

Система метаобъектов позволяет также проверить, наследует ли a класс MyClass1 :

Однако предпочтителен предыдущий вариант с qobject_cast .

5.3. Деревья объектов

Объекты классов, наследующих от QObject , могут быть организованы в древовидную структуру. При удалении объекта Qt удаляет его дочерние объекты, которые в свою очередь удаляют свои дочерние объекты, и т.д. Иными словами, удаление объекта приводит к удалению всего поддерева, корнем которого он является.

Пусть у нас имеются классы ClassA и ClassB :

Листинг 2.1. Объявление My >
Листинг 2.2. Определение методов My >

Здесь родительский объект устанавливается в конструкторе QObject :

QObject::QObject (QObject *parent = 0);

Его можно установить в последующем при помощи метода setParent() и получить при помощи parent() :

void QObject::setParent (QObject *parent);
QObject* QObject::parent() const;

Если создать в стеке по одному из объектов A и B, то сначала будет создан A, потом B. В соответствии со стандартом C++, удаление происходит в обратном порядке – сначала B, затем A:

Листинг 2.3. Создание экземпляров My >

Если создать B в куче и назначить его дочерним объектом для A, то вместе с A автоматически удалится B:

Листинг 2.4. Создание экземпляра A класса My >

Аналогично для более сложных деревьев:

Рисунок 8. Пример многоуровневого дерева объектов
Листинг 2.5. Многоуровневое дерево объектов с корнем в стеке

После удаления A удалится всё дерево.

Таким образом, программист должен создавать объекты в куче и задавать соответствующие иерархии, а заботу об управлении памятью Qt берет на себя.

Если объект и его дочерние объекты созданы в стеке, то подобный порядок удаления может привести к ошибкам.

Здесь при выходе из области действия сначала будет удален объект A, так как он был создан последним. При этом Qt удалит и его дочерний объект B. Но потом будет сделана попытка удаления B, что приведет к ошибке.

В другом случае проблем не будет, потому что при вызове деструктора QObject объект удаляет себя из списка дочерних объектов родительского объекта:

Вообще говоря, дочерние объекты должны размещаться в куче.

У каждого QObject есть свойство objectName , для доступа к которому используются методы

По умолчанию objectName – пустая строка. Через это свойство объектам в дереве можно присвоить имена для последующего поиска.

– возвращает список дочерних объектов.

– возвращает дочерний объект с именем name, который можно привести к типу T, либо 0, если такой объект не найден. Без аргумента name возвращает все дочерние объекты. Поиск осуществляется рекурсивно.

QList QObject::findChildren (const QString& name = QString()) const;

– возвращает все дочерние объекты с именем name, которые можно привести к типу T, либо пустой список, если таких объектов не найдено. Без аргумента name возвращает все дочерние объекты. Поиск осуществляется рекурсивно.

QList QObject::findChildren (const QRegExp& regExp) const;

– аналогично, но с поиском по регулярному выражению regExp.

– выводит отладочную информацию о дереве объектов с данным корнем.

5.4. Сигналы и слоты

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

В Qt вводится концепция сигналов и слотов.

Сигнал отправляется при вызове соответствующего ему метода. Программисту при этом нужно только указать прототип метода в разделе signals .

Слот является методом, исполняемым при получении сигнала. Слоты могут объявляться в разделе pulic slots, protected slots или private slots . При этом уровень защиты влияет лишь на возможность вызова слотов в качестве обычных методов, но не на возможность подключения сигналов к слотам.

Модель сигналов и слотов отличается от модели событий и обработчиков тем, что слот может подключаться к любому числу сигналов, а сигнал может подключаться к любому числу слотов. При отправке сигнала будут вызваны все подключенные к нему слоты (порядок вызовов не определен).

5.4.1. Объявление сигналов и слотов, отправка сигналов


В качестве типичного примера слота рассмотрим метод получения свойства (getter). Методу установки свойства (setter) при этом будет соответствовать сигнал.

Листинг 3.1. Класс My >

Обратите внимание на макрос Q_OBJECT , сигнализирующий Qt о том, что используются возможности системы метаобъектов.

Листинг 3.2. Реализация методов класса My >

Ключевое слово emit отвечает за отправку сигнала.

Для сигнала задается только прототип, причем сигнал не может возвращать значение (т.е., указывается void ). За реализацию отвечает компилятор метаобъектов, он же преобразует расширенный синтаксис с ключевыми словами signals, slots, emit в стандартный код C++.

На самом деле, ключевые слова можно заменить на макросы Q_SIGNALS, Q_SLOTS и Q_EMIT . Это полезно, если вы используете сторонние библиотеки, в которых уже используются слова signals, slots или emit .

Обработка ключевых слов отключается флагом no_keywords . В файл проекта qmake (.pro) добавьте

Вы можете посмотреть на результат работы компилятора метаобъектов в файле moc_slots.cpp , который генерируется на основе slots.h и компилируется вместе с остальными .cpp .

5.4.2. Подключение сигнала к слоту

Листинг 3.3. Подключение сигнала vo >

Здесь при помощи QObject::connect сигнал объекта a соединяется со слотом объекта b (передаются указатели на QObject ). Макросы SIGNAL и SLOT формируют строковые сигнатуры методов. Их аргументы должны содержать прототипы без указания имен переменных, т.е. SIGNAL(valueChanged(int x)) – недопустимый вариант.

Сигнатуры используются для сверки типов: сигнатура сигнала должна соответствовать сигнатуре слота. При этом у слота сигнатура может быть короче, если дополнительные аргументы игнорируются.

Другой вариант вызова QObject::connect :

Таким образом, здесь вызов MyClass::setValue для a задействует MyClass::setValue для b .

Обратите внимание на строку if (x_ == x) return; . Она нужна, чтобы избежать проблем при циклических соединениях. Например, следующий код сработает:

Листинг 3.4. Циклическое соединение сигналов vo >

QObject::connect возвращает true , если соединение успешно установлено, и false в противном случае – например, когда сигнал или слот не обнаружен, либо их сигнатуры несовместимы.

Если добавить при помощи QObject::connect одинаковые соединения, то слот будет вызываться несколько раз.

5.4.3. Отключение

Для отключения сигнала от слота используется QObject::disconnect :

При успешном отключении возвращается true .

Если вместо сигнала (SIGNAL(. )) указать 0, то данный получатель сигнала ( b ) и слот отключаются от любого сигнала:

Если 0 указать вместо получателя сигнала ( b ) и слота (SLOT(. )) , то отключено будет всё, что подключено к данному сигналу:

Если 0 указать вместо слота (SLOT(. )) , то отключено будет всё, что подключено к данному получателю сигнала ( b ):

Получаем следующие варианты вызова QObject::disconnect :

При удалении одного из объектов соединения Qt автоматически удаляет само соединение.

5.4.4. Ограничения

У компилятора метаобъектов имеется ряд ограничений, которые распространяются и на работу с сигналами и слотами.

    moc не обрабатывает шаблоны и макросы, поэтому шаблоны классов не могут определять сигналы и слоты, а при объявлении сигналов и слотов нельзя использовать макросы (в том числе при указании параметров).

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

Однако некоторые возможности препроцессора использовать можно. Доступны простые условные конструкции (с директивами #if, #ifdef, #ifndef, #else, #elif, #endif , а также специальным оператором defined ). Для создания объявлений у moc имеется опция командной строки -D . Утилита qmake передает moc все объявления, перечисленные в параметре проекта DEFINES .

Например, moc правильно обработает

также будет обработан, только если вызвать moc -DFOO , либо если до него имеется строка #define FOO .

Типы должны быть указаны полностью, так как QObject::connect() сравнивает их буквально. В частности, если внутри класса Foo определяется перечисление Bar , то в аргументах сигнала нужно указывать Foo::Bar :

В качестве параметров сигналов и слотов нельзя использовать указатели на функции. Например,

не является допустимым аргументом. Можно использовать typedef:

Обычно вместо указателей лучше применять наследование и виртуальные функции.

  • Вложенные классы не могут содержать сигналы и слоты.
  • Сигналы и слоты, возвращающие ссылки, обрабатываются таким образом, как если бы они возвращали void .
  • В разделах signals и slots могут объявляться только сигналы и слоты.
  • 5.5. Свойства

    Класс, наследующий QObject , может содержать объявление свойства при помощи макроса Q_PROPERTY() :

    Q_PROPERTY( type name

    Обязательные параметры макроса:

    • type – тип свойства;
    • name – имя свойства;
    • getFunction – const-метод для считывания значения; возвращаемый тип должен быть type, type* либо type&.

    Не обязательные параметры макроса:

    • setFunction – метод для установки значения свойства, должен возвращать void и принимать только один аргумент типа type, type*, либо type&;
    • resetFunction – метод для установки значения свойства по умолчанию, зависящего от контекста, должен не иметь аргументов и возвращать void ;

    Методы могут быть виртуальными либо унаследованными от базового класса. При множественном наследовании они должны принадлежать первому классу в списке.

    Для не обязательных атрибутов DESIGNABLE, SCRIPTABLE, STORED, USER допускается указание булевых значений:

    • DESIGNABLE – показывать ли свойство в Qt Designer и подобных графических программах. По умолчанию true , также можно указать булев метод.
    • SCRIPTABLE – должно ли свойство быть видимым скриптовому движку. По умолчанию true , также можно указать булев метод.
    • STORED – должно ли свойство сохраняться при сохранении состояния объекта либо оно вычисляется через другие свойства. По умолчанию true .
    • USER — редактируется ли свойство пользователем. Обычно у классов, соответствующих элементам управления, бывает одно такое свойство. По умолчанию false .

    Например, QWidget объявляет, в числе прочих, следующие свойства:

    Q_PROPERTY (QSize minimumSize READ minimumSize WRITE setMinimumSize) Q_PROPERTY(int minimumWidth READ minimumWidth WRITE setMinimumWidth STORED false DESIGNABLE false) Q_PROPERTY(int minimumHeight READ minimumHeight WRITE setMinimumHeight STORED false DESIGNABLE false)

    Свойство minimumSize имеет тип QSize и может быть получено при помощи QSize minimumSize() const и установлено при помощи void setMinimumSize ( const QSize& ). minimumWidth и minimumHeight вычисляются через minimumSize , поэтому для них указано STORED false .

    Пример свойства с атрибутом USER – text в QLineEdit :

    Для считывания и записи свойства используются методы:

    property() возвращает значение свойства либо неправильный вариант QVariant , если такого свойства нет.

    setProperty() возвращает true , если у объекта есть указанное свойство с типом, совместимым с переданным значением. В противном случае возвращается false .

    Если в классе нет указанного свойства, то добавляется динамическое свойство объекта. Перечень динамических свойств можно получить при помощи

    Рассмотрим пример использования свойств. Пусть класс MyClass имеет строковое свойство text (типа QString ):

    Листинг 4.1. Объявление класса My >
    Листинг 4.2. Определение методов класса My >

    Работа со свойством:

    Листинг 4.3. Работа со свойством text объекта My >

    Программа должна вывести на экран следующее:

    Разумеется, безопаснее и быстрее вызывать методы конкретного класса для считывания и записи свойств. property() и setProperty() нужны в том случае, когда о классе ничего не известно кроме имен и типов свойств.

    Если для класса не известен даже перечень свойств и методов, можно использовать метаобъект.

    5.6. Работа с метаобъектами

    Метаобъект возвращается методом

    С его помощью можно динамически получить информацию о классе, как, например, в Java Reflecion API (EN).

    5.6.1. Основная информация

    Имя класса возвращает

    const char * QMetaObject::className() const;

    Указатель на метаобъект базового класса –

    const QMetaObject* superClass() const;

    5.6.2. Методы

    Через систему метаобъектов доступны только те методы и конструкторы, перед объявлениями которых указан макрос Q_INVOKABLE :

    Для доступа к методам (в том числе сигналам и слотам) используйте

    Методы и свойства класса проиндексированы. Доступ к методу по индексу осуществляется через QMetaObject::method() .

    Общее число методов, с учетом наследованных, возвращает QMetaObject::methodCount() . Смещение методов класса возвращается QMetaObject::methodOffset() , оно показывает, с какого индекса начинаются методы данного класса. Смещение увеличивается при наследовании и показывает число методов базовых классов.

    Пример прохода по методам:


    Если бы мы начали с индекса 0, то получили бы методы всех базовых классов, в том числе QObject :

    Методы, начинающиеся с _q_ , используются внутри Qt и не являются частью API.

    Конструкторы указываются отдельно:

    Например, получим перечень конструкторов QObject :

    Листинг 5. Вывод конструкторов QObject через систему метаобъектов

    Индекс метода, сигнала, слота или конструктора можно получить по его сигнатуре:

    Для конструкторов, методов или сигналов ожидаются нормализованные сигнатуры. Их можно получить при помощи статического метода

    Это текстовое приведение к каноническому виду, используемое, в частности, при проверке совместимости сигнала и слота.

    5.6.3. Свойства

    Аналогично можно работать со свойствами.

    (Если просмотреть все свойства, включая наследованные, то вы увидите, по меньшей мере, objectName из QObject .)

    Индекс свойства можно получить по его имени:

    5.6.4. Перечисления

    Перечисления регистрируются в классе при помощи макроса Q_ENUMS() .

    Перечисление, значения которого можно комбинировать при помощи побитового ИЛИ, называется флагом и должно регистрироваться при помощи Q_FLAGS() .

    Листинг 6.1. Класс My >

    Флаги используются следующим образом:

    Динамическая работа с перечислениями:

    Листинг 6.2. Вывод перечислений и флагов My >

    Индекс перечисления можно получить по его имени:

    5.6.5. CLASSINFO

    При помощи макроса Q_CLASSINFO() к метаобъекту можно добавлять пары имя–значение. Например,

    Листинг 7.1. Класс My >

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

    Для примера выше:

    Листинг 7.2. Вывод >

    Индекс CLASSINFO можно получить по его имени:

    5.6.6. Вызов конструкторов и методов

    Передача аргументов осуществляется через объекты QGenericArgument и QGenericReturnArgument . Они создаются макросами Q_ARG и Q_RETURN_ARG .

    Для создания нового экземпляра класса используется метод метаобъекта newInstance() , которому можно передать до 10 аргументов.

    В случае ошибки возвращается 0.

    Для вызова метода используется invokeMethod() :

    • obj – указатель на объект;
    • member – имя метода;
    • type – тип вызова:
      • Qt::DirectConnection – незамедлительно,
      • Qt::QueuedConnection – при начале выполнения QCoreApplication::exec() ,
      • Qt::AutoConnection – синхронно, если объект находится в том же потоке, и асинхронно в противном случае;
    • ret – возвращаемое значение;

    далее следует до 10 аргументов.

    При асинхронном вызове значение не может быть вычислено.

    Имеются перегруженные версии invokeMethod() . Если вы не укажете тип вызова, то будет использоваться Qt::AutoConnection . Если вы не укажете возвращаемое значение, то оно будет проигнорировано.

    Те же возможности предоставляет класс QMetaMethod :

    Точно так же, тип соединения и/или возвращаемое значение можно не указывать.

    Асинхронный вызов используется в том случае, когда вычисления занимают слишком много времени, поэтому их результат не ожидается в точке вызова. Подобные вычисления обычно помещают в отдельный поток, поэтому по умолчанию ( Qt::AutoConnection ) методы объектов из внешних потоков вызываются асинхронно.

    Рассмотрим следующий класс:

    Листинг 8.1. Класс My >

    Обращение к конструктору и методам:

    Листинг 8.2. Вызов конструкторов и методов класса My >

    text() и setText() вызываются таким образом лишь в качестве простого примера работы с QMetaObject::invokeMethod() . Как вы уже знаете, эти два метода должны быть связаны со свойством.

    Также обратите внимание, что text() возвращает QString , но не const QString& . Иначе бы система метаобъектов считала, что text() возвращает void .

    Заключение

    Для эффективной работы с классами на стадии выполнения Qt использует специальную объектную модель, в которой при помощи наследования от QObject и генерирования кода компилятором метаобъектов реализованы:

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

    В следующей статье мы рассмотрим типы, варианты, ссылки и разделение данных.

    Ресурсы для скачивания

    Похожие темы

    • Исходный код с примерами (EN).
    • Qt Software (EN).
    • Документация по Qt (EN).
    • Qt Centre (EN).
    • Информационный бюллетень «Qt Quarterly» (EN).
    • Списки рассылки Qt (EN).
    • Jasmin Blanchette, Mark Summerfield. C++ GUI Programming with Qt 4 (2nd Edition) (EN). Prentice Hall: 2006. – 752 pp.
    • Daniel Molkentin. The Book of Qt 4: The Art of Building Qt Applications (EN). No Starch Press: 2007. – 440 pp.
    • J. Thelin. Foundations of Qt Development (EN). Apress: 2007. – 528 pp.
    • Bjarne Stroustrup. The C++ Programming Language (Special Edition) (EN). Addison-Wesley: 2000 – 1040 pp.

    Комментарии

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

    Велика ли разница в трудозатратах при выборе С++ и QT вместо C# и WPF?

    Вопрос в том, насколько хорошо вы знаете C++. Сам по себе язык сложнее C# по многим критериям + Qt превносит свою специфику добавляя сложности.
    Советую отдельно рассмотреть QtQuick, а не просто QtWidgets, который для интерфейсов использовать намного легче + можно лёгкую логику на JS писать. Я слышал, что некоторые умудряются всё на QML + JS написать, вообще не трогая плюсы. У меня так не получалось :)
    С C# + WPF не работал.

    Пишем игру «Жизнь» под Android используя C++ и Qt за час.

    Всем привет! Недавно видел на пабликах типа ТП посты мол «делаем игру жизнь на java за час», «делаем игру жизнь на python за час», вот решил сделать пост, делаем игру жизнь под андроид используя C++ и библиотеки Qt за час.

    Важно отметить что игра занимает

    100 строчек кода(исключая h файлы, символы переноса и т.п.), а также то, что созданная игра будет работать и под винду, и под андроид, и под линукс, и под ios и под mac os x.

    И так начнем. Правила игры жизнь я думаю вы знаете. Есть поле с клетками. Клетка может быть живая или мертвая. По прошествии хода, если вокруг мертвой клетки есть 3 живых, она становится живой. Если вокруг живой клетки будет 1 или 0 живых, то она становится мертвой, также она становится мертвой если вокруг нее более 3 живых клеток. Впринципе все, подробнее вы можете прочесть на википедии.

    И так что у нас должно быть:

    Поле с N*M клеток, кнопка «Новая игра», кнопка «Начать эволюцию». Поле забито прямогуольниками, изначально все пустые. При нажатии на клетку она окрашивается в черный или белый цвет, в зависимости от того какой цвет был там раньше.

    2. Логика. Мы должны иметь двумерный массив(используем QT’шный вектор), в котором 0 отмечена мертвая клетка а единицей живая клетка. У меня была цель создать игру примерно за час, и поэтому этот 0 и 1 соответствуют черному и белому цветам многоугольников. Соответственно у нас есть массив с указателями на наши прямоугольники. Это не хорошо, ибо логика должна быть отделена от GUI, но для уменьшения размера кода — решил сделать так.

    Должны быть реализованы функции подсчета соседей для каждой из клеток, зная положение клетки по X и Y. После каждого хода, мы рассчитываем количество соседей для каждой из клеток, и в зависимости от состояния клетки и количества её соседей добавляем клетку в массив(вектор), для изменения её состояния. Если за 1 ход не было добавлено ни 1 клетки, то игра заканчивается, выводим пользователю количество ходов

    Если вы не знакомы с наследованием и библиотекой STD в C++, то вы являетесь новичком в C++ и возможно код покажется вам запутанным. К сожалению не хотелось бы писать про все это в этом посте, ибо для новичков информации в интернете — тонны, а переписывать еще раз это — просто не зачем. Если вы с этим знакомы, но незнакомы с сигнально-слотовой системой Qt тоже порекомендую прочитать over9000 материалов по этой теме. Если потребуются пояснения я отвечу в комментах.

    И так, как выглядит GUI:

    Скачиваем Qt Creator с официального сайта Qt(qt.io), выбираем бесплатный вариант для GPL приложений. Запускаемся, создаем новый проект, используя QWidget, с графической формой

    Переходим к созданию. Переходим в режим дизайн и добавляем на форму «Graphics View» и 2 Push Button. Примерно вот так как на следующей картинке, и кликая правой кнопкой мыши по форме выбираем (Скомпоновать по сетке)

    GUI готово! Теперь нам нужно перейти к непосредственно программированию.

    QGraphicsView — это виджет, который может отображать графические элементы. QGraphicsView отображает элементы, который расположены на QScene. На QScene мы размешаем элементы в декартовой системе координат, а с помощью QGrahicsView мы её отображаем(можно поворачивать, увеличивать масштаб и т.п.).

    Элементы бывают разных типов. Есть простые — QGraphicsRectItem — это многоугольник, который к слову нам и понадобиться. Есть QGraphicsPixMapItem который отобразит нам изображение. Есть QGraphicsLineItem — это линия. И другие.


    И так, первая задача. Разместить на сцене N*M QGraphicsRectItem’ов — наших клеток. Мертвой клеткой будет считаться клетка, с Kletka->brush().color() == Qt::white живой Kletka-> brush().color() == Qt::black. И запихнуть все указатели на QGraphicsRectItem в отдельный двумерный вектор, чтобы мы могли с ними работать.

    Однако, для этой задачи нам не подойдет «чистый» QGraphicsRectItem. Нужно будет создать класс наследник, и в нем реализовать свою обработку нажатия на клетку. Ведь в самом начале игры нам нужно будет выставить первичные мертвые и живые клетки на поле.

    Т.е. по нажатию на наш прямоугольник, он должен окрашиваться в требуемый цвет. А у чистого QGraphicsRectItem обработка данного события пустая.

    Создадим класс LifeRect основанный на QGraphicsRectItrem., и переопределим в нем mousePressEvent

    Теперь займемся реализацией. Конструктор будет использовать конструктор с такими же параметрами как у QGraphicsRectItem(позиция по x, позиция по y, широта, высота, родитель). В событии mousePressEvent будет вызываться функция changeColor.

    И так, переходим дальше. Работаем с нашим виджетом(формой) — widget.c. В этом классе реализуется логика игры.

    Что нам необходимо?

    1. Таймер. Каждые 0.1 секунды будет происходить 1 ход.

    2. Слоты нажатия на кнопку «Старт» и «Новая игра» соответственно.

    3. Размеры поля — X и Y клеток. Принимаются через конструктор.

    4. Переменная для хранения количества итераций(для вывода при завершении игры)

    5. Двумерный вектор(используется QVector, а не std::vector) который хранит указатели на созданные нами LifeRect’ы. К его элементам мы будем обращаться, и будем представлять живое и мертвое состояние по его цвету, как я уже и писал ранее. Если среди читателей будут новички C++ в комментах могу помочь. Просто представляйте что это массив.

    6. Функция для новой игры(обнуление поля, обнуления количества итераций).

    7. Функция подсчета живых соседей рядом.

    И так, начнем. Собственно вот заголовочный файл:

    В конструкторе присвоим начальные данные(x,y из входных, 0 итераций, укажем то что сцена пока-что пустая, родительский элемент отсутствует. Проинициализируем таймер, но запускать его не будем

    Создать слот on_pushButton нужно нажав правой кнопкой по кнопке на форме, выбрать перейти к слоту, и выбрать сигнал clicked()

    Дальше — интереснее. И так, по нажатию на кнопку новая игра, мы должны нарисовать графическую сцену, с X*Y мертвыми многоугольниками, и наполнить двумерный вектор указателей на многоугольники ими же. Чтобы потом,когда игрок заполнит поле и нажмет на кнопку «СТАРТ» запускается таймер, по каждому тику таймера обходить этот вектор, вычислить количество живых соседей каждой клетки, и перерисовать требуемые.

    Постарался максимально прокомментировать код.

    К слову говоря, позиции осей X и Y в графической сцене таковы:

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

    Осталось лишь только реализовать функцию подсчета соседей. Думаю, в ней проблем не будет. Мы просто смотрим на цвета наших 8 соседей(если вылезли за границы то перемещаемся в начало или конец соответственно) и выдаем на выход их количество

    Все готово! Запускаем и играем на Linux, Windows или вашем Mac.

    Что потребуется(если вкратце) для запуска на Android?

    1. Пакеты Android SDK и Android NDK(для C++).

    2. Устройство андроид или AVD.

    Вы должны сконфигурировать ваш Qt Creator, в таком виде(ваши пути), и добавить в проектах сборку Android. Потребуется скачать в AVD драйвера USB, и API требуемых версий Android. Затем уже попробовать установить приложение на телефон/эмулятор. Я могу помочь, или привести ссылки где это подробно разбирается в комментах

    Пробуем на стареньком LG Optimus One с Andro >

    Ищутся начинающие программисты С++, Qt, Java, PHP. Удалённо.

    Ищутся начинающие программисты:
    http://netdat.ru/job
    (Постоянная удалённая работа, Linux).

    А через месяц-два будет еще актуально? И насколько «за еду» будет работать джун?

    «Реестр» параметров с одноуровневым вложением.

    qsettings же, ну

    Установка среды разработки C++ (MinGW) и Qt под MS Windows

    Наверно, молодой парнишка, лет 18-20, торопился писать ;-)

    Хотя порывы похвальные :-)

    со всеми контактами (в особенности э-почта, телефон, Скайп) по адресу: tech@netdat.ru

    Тестовые задания (хотя бы один язык программирования):

    Про сами задания я вообще молчу)

    Хорошо хоть не кончающиеся ищутся.

    Спасибо за корректировку.

    1.Будет актуально 2.На тестовый срок из расчёта 150 рублей/час. Потом больше (по результатам)

    Работа сейчас под Linux. Но по-скольку большинство студентов и вчерашних студентов под Windows, именно для них написано как устанавливать C++ (MinGW) и Qt под MS Windows.

    Что-то у меня такое чувство возникло, что студент не написал лабы, остался с хвостом и в последних числах лета опомнился и выложил свои тестовые задачки в Job, чтобы ему из задаром решили. Уж больно похоже. Извиняюсь, если это не так.

    Так оно и есть, запахом просто прёт)

    Домен был взят в 14, на сайте «Bulletin Publishing System, 2011-2020.»

    Буду рад предложениям по сотрудничеству.

    т.е. тут даже ни о какой ООО речи не идёт.

    Текст на сайте, в край неграмотный. А за некоторые статьи двойки нужно ставить в зачётку.

    P.S. веселят такие предложения)

    Гибкий график, человеческое отношение к возможным вашим сложностям.

    Человеческое отношение к сложностям :D

    Так и есть, по крайней мере, по Java таких тестовых заданий не бывает

    Да походу так оно и есть. Сайт просто ахтунговый, да и я подрабатывая грузчиком по выходным я 200 в час имею за выход на три часа.

    QT 4: программирование GUI на С++

    Единственное официальное руководстро по практическому программированию в среде Qt 4.1.

    Применяя средства разработки Qt компании «Trolltech», вы сможете создавать на С++ промышленные приложения, которые естественно работают в средах Windows, Linux/UNIX, Linux для встроенных систем без изменения программного кода и Mac Os X. Книга написана сотрудниками компании «Trolltech». Она представляет собой практическое руководство по успешному применению самой мощной из всех созданных до сих пор версий Qt — Qt 4.1.

    Из книги «Qt 4: программирование GUI на С++» вы узнаете о наиболее эффективных приемах и методах программирования с применением Qt 4 и овладеете ключевыми технологиями в самых различных областях — от архитектуры Qt модель/представление до мощного графического процессора 2D. Авторы вооружают читателей беспрецедентно глубокими знаниями модели событий и системы компоновки Qt.

    На реалистических примерах они описывают высокоэффективные методы во всех областях — от разработки основных элементов графического пользовательского интерфейса до передовых методов интеграции с базой данных и XML. Каждая глава содержит полностью обновленный материал.

    • Включает новые главы по архитектуре Qt 4 модель/представление и поддержке подключаемых модулей Qt, а также краткое введение в программирование встроенных систем на платформе Qtopia.

    • Раскрывает все основные принципы программирования в среде Qt — от создания диалоговых и других окон до реализации функциональности приложений.

    • Знакомит с передовыми методами управления компоновкой виджетов и обработкой событий.

    • Показывает, как можно с наибольшей эффективностью использовать новые программные интерфейсы Qt 4, в частности мощный графический процессор 2D и новые простые в применении классы-контейнеры.

    • Представляет передовые методы Qt 4, которых нет ни в одной книге: от создания подключаемых модулей, расширяющих возможности Qt, и приложений, до применения «родных» для конкретной платформы программных интерфейсов.

    • Содержит приложение с подробным введением в программирование на С++ в среде Qt для опытных Java-разработчиков.

    Жасмин Бланшет (Jasmine Blanchette) — менеджер по документированию и старший разработчик компании «Trolltech» с 2001 года. Он является редактором «Qt Quarterly», информационного бюллетеня компании «Trolltech», и соавтором книги «Qt 3: программирование GUI на С++».

    Марк Саммерфилд (Mark Summerfield) — независимый преподаватель и консультант по С++, Qt и Python. Он работал менеджером по документированию в компании «Trolltech» на протяжении трех лет. Марк является соавтором книги «Qt 3: программирование GUI на С++».

    Краткая история Qt 3

    Часть I. Основные возможности средств разработки Qt 3

    Часть II. Средний уровень Qt-программирования 43

    Часть III. Advanced Qt 108

    Приложение А. Установка Qt 133

    Приложение Б. Введение в С++ для программистов Java и С# 134

    Вступление

    Почему Qt? Почему мы, программисты, выбираем Qt? Конечно, существуют очевидные ответы: совместимость классов Qt, базирующаяся на применении одного источника, богатство его возможностей, производительность С++, наличие исходного кода, его документация, качественная техническая поддержка и множество других причин, указанных в глянцевых маркетинговых материалах компании «Trolltech». Все это очень хорошо, но здесь не указано самое важное: Qt пользуется успехом, потому что она нравится программистам.

    Почему программистам нравится одна технология и не нравится другая? Сам я считаю, что разработчики программного обеспечения отдают предпочтение такой технологии, которая «ощущается» как правильная, и не любят все то, что не дает такого ощущения. «Ощущать» технологию как правильную означает многое. В версии этой книги для Qt 3 я упоминал телефонную систему компании «Trolltech» в качестве очень подходящего примера особенно плохой технологии. Эта телефонная система не воспринимается как правильная система, потому что она вынуждает нас совершать случайные действия в столь же случайном контексте. Случайность не создает ощущения правильности. Повторяемость и избыточность тоже воспринимаются как неправильные. Хорошие программисты ленивы. Что нас особенно привлекает в компьютерах (например, в сравнении с садоводством), так это то, что нам не приходится повторять одно и то же раз за разом.

    Позвольте мне проиллюстрировать это на практическом примере — на формах компенсации командировочных расходов. Обычно эти формы имеют вид причудливых электронных таблиц; вы их заполняете и получаете реальные деньги. На первый взгляд ничего сложного, и при наличии денежного стимула эта задача становится простой для дипломированного инженера.

    Однако в реальной жизни все не так просто. Хотя никто другой в компании не испытывает никаких затруднений при работе с этими формами, у инженеров возникают проблемы. И поговорив с сотрудниками других компаний, убеждаешься в том, что это распространенное явление. Мы откладываем оформление компенсаций до самого последнего момента и иногда вообще можем забыть об этом. Почему так происходит? Заполнение форм на первый взгляд простая, стандартная процедура. Собираешь квитанции, нумеруешь и записываешь эти номера в соответствующие поля с указанием даты, места, описания и суммы. Нумерация квитанций и запись номеров в форму предназначены для облегчения кому-то работы, но, строго говоря, номера избыточны, поскольку дата, место, описание и сумма однозначно идентифицируют квитанцию. Можно подумать, что совсем немного дополнительной работы позволяет вернуть свои деньги.

    Однако небольшое раздражение вызывают суточные, которые зависят от места вашей поездки. Имеется некий отдельный документ со списком стандартизованных сумм суточных для всех различных пунктов назначения командировок. Нельзя просто указать «Чикаго»; вместо этого приходится самому находить сумму суточных для Чикаго. Аналогичное раздражение вызывает поле обменного курса. Приходится искать текущий обменный курс где-нибудь в системе помощи Google и затем вводить его в каждое поле. Ну, строго говоря, следует подождать, пока компания, обслуживающая вашу кредитную карту, не пришлет вам счет с указанием фактического используемого ею обменного курса. Хотя сделать это нетрудно, просмотр различных источников и поиск в них нужных данных с последующим их переносом в различные места формы воспринимается как ничем не оправданное неудобство.

    Программирование может очень сильно напоминать заполнение наших форм по компенсации командировочных расходов, только здесь все обстоит еще хуже. И здесь на помощь приходит Qt. Qt не такая. Во-первых, Qt логична. И, во-вторых, Qt вызывает интерес. Qt позволяет вам сконцентрироваться собственно на вашей задаче. Когда первоначальные создатели Qt сталкивались с проблемой, они не искали просто хорошее решение или самое простое решение. Они искали правильное решение и затем документировали его. Конечно, они делали ошибки, и, конечно, их некоторые проектные решения не прошли проверку временем, но все же многое сделано правильно, а неправильное может и должно быть исправлено. Вы можете убедиться в этом на том факте, что система, первоначально задуманная как мостик между Windows 95 и Unix/Motif, теперь объединяет такие непохожие современные настольные системы, как Windows XP, Mac OS X и GNU/Linux, и обеспечивает основу для Qtopia — платформы создания приложений для встроенных систем в Linux.

    Задолго до того, как инструментарий Qt стал столь популярным и столь широко используемым, нацеленность разработчиков Qt на поиск правильных решений сделала Qt особой. Верность этому принципу столь же сильна сегодня, и она относится к каждому, кто разрабатывает и сопровождает Qt. Для нас работа над проектом Qt является одновременно и ответственным делом, и привилегией. Мы испытываем гордость оттого, что помогаем вам стать профессионалами и что работа с системами с открытым исходным кодом становится более простой и доставляет больше удовольствия.

    Maттиac Эттрич (Matthias Ettrich)

    Предисловие

    Qt представляет собой комплексную рабочую среду, предназначенную для разработки на С++ межплатформенных приложений с графическим пользовательским интерфейсом по принципу «написал программу — компилируй ее в любом месте». Qt позволяет программистам использовать дерево классов с одним источником в приложениях, которые будут работать в системах от Windows 95 до XP, Mac OS X, Linux, Solaris, HP-UX и во многих других версиях Unix с X11. Библиотеки и утилиты Qt входят также в состав Qtopia Core — программного продукта, обеспечивающего собственную оконную систему для Embedded Linux.

    Различия Qt Creator и Visual Studio 2015

    Рассказывает Тимофей Седов, разработчик интеллектуальной ассистентки Никки

    В этой записи хотелось бы поделиться своими впечатлениями от IDE Visual Studio. С тех пор, как мы начали разрабатывать универсальную версию нашей интеллектуальной ассистентки Никки и отошли в сторону от Qt Creator, впечатления, надо сказать, остались только положительные.


    Работали мы в версии 2015-го года и первое, что бросается в глаза – ребята из Microsoft проделали действительно огромную работу в сравнении с их версией 2013-го. Если внешне среда практически не изменилась, то внутренностей стало куда больше. Тут тебе и мощные средства диагностики приложения, встроенный конструктор макетов, множество, я повторюсь – множество различных средств для разработки кроссплатформенных приложений, что касается не только Windows и Windows Phone, но также и других платформ: Android, iOS.

    Итак, раз уж мы создавали приложение типа «Universal App Windows», то и рассказывать я буду именно с точки зрения создания этого типа программ. К тому же это мой первый опыт в разработке Metro-приложений.

    Начинаем

    Как только вы создаете свой проект, то тут же попадаете в конструктор макетов, где нас встречает планшет, куда, собственно, и будут помещаться все ваши UI-элементы. Кроме того, если вам вдруг не удобно добавлять элементы из списка и проставлять свойства в специальном меню, как это было для меня, то можно открыть обычную XAML-разметку. Чем это удобнее? Хотя бы тем, что здесь вам проще будет определиться с иерархией элементов. Если честно, то визуальным представлением макета я пользовался довольно редко, т.к. после понимания того, как строиться XAML-файл, становиться довольно просто определить куда и как прописать нужный элемент именно через него. Единственная проблема, с которой мне пришлось столкнуться – конструктор довольно-таки часто падал с ошибками (решалось только перезагрузкой). Но думаю, к финальной версии студии это поправят.

    Если вдруг, стандартные UI-элементы вас не устраивают, то можно их перерисовывать. Пока что это единственная вещь, которая мне не понравилась при разработке. По сравнению с тем, как это устроено в Qt (а именно через QSS), здесь все более сложно и громоздко. Если в Qt я пришел со знанием того, что такое CSS и все шло гладко, то для реализации задуманного в XAML мне пришлось полистать документацию (ни в коем случае не говорю, что это плохо, но время, как не посмотри, отнимает).

    Собственно о программировании

    Теперь о самом программировании. Писали на C++/CX, где вы можете комбинировать C++ и широкий выбор библиотек Windows Runtime. Тут Microsoft активно продвигает стандарт C++11 и более новые. Допустим, все асинхронные функции построены на основе лямбда-выражений, активно используется квалификатор auto , часто встречается необходимость в умных указателях (таких как shared_ptr ). И это круто. Волей-неволей, но придется вникать в современные стандарты языка, который почему-то даже в новой Qt Creator по умолчанию отключен.

    В принципе, как в Qt, так и в Windows Runtime все построено на классах. Но как только начинаешь писать код и использовать какие-то библиотеки, то понимаешь, что есть одно огромное отличие – большая часть работы построена на создании/вызове асинхронных функций. Если вы прежде не сталкивались с этим, то поверьте — вам придется почитать документацию (в этом случае это даже хорошо, вникните в асинхронное программирование). Вот материал по теме PPL (библиотеки параллельных шаблонов):

    Думаю, что через пару дней прочтения и разбора пары примеров, у вас сложиться представление о том, как писать приложения на C++/CX. В сравнении с Qt: использование уже готовых асинхронных функций, а также довольно-таки простое создание своих собственных намного проще, чем параллельные вычисления с помощью потоков в Qt.

    23 ноября в 10:30, Санкт-Петербург, беcплатно

    Краткий обзор кроссплатформенного фреймворка Qt

    Qt — это кроссплатформенный фреймворк для разработки ПО на языке программирования C++(и не только). Также имеется и для Ruby — QtRuby, для Python — PyQt, PHP — PHP-Qt и других языков программирования. Разрабатывается компанией Trolltech с 1996 года.

    С использованием этого фреймворка написано множество популярных программ: 2ГИС для Andro >

    Qt полностью объектно-ориентированная, кросс-платформенная. Дает возможность разрабатывать платформо-независимое ПО, написанный код можно компилировать для Linux, Windows, Mac OS X и других операционных систем. Включает в себя множество классов для работы с сетью, базами данных, классы-контейнеры, а также для создания графического интерфейса и множество других(чуть ниже).

    Qt использует MOC (Meta Object Compiler) для предварительной компиляции программ. Исходный текст программы обрабатывается MOC, который ищет в классах программы макрос Q_OBJECT и переводит исходный код в мета-объектный код, после чего мета-объектный код компилируется компилятором C++. MOC расширяет функциональность фреймворка, благодаря ему добавляются такие понятия, как слоты и сигналы.

    В Qt имеется огромный набор виджетов (Widget), таких как: кнопки, прогресс бары, переключатели, checkbox, и другие — они обеспечивают стандартную функциональность GUI (графический интерфейс пользователя). Позволяет использовать весь функционал пользовательского интерфейса — меню, контекстные меню, drag&drop.

    Одно окно в разных ОС

    Как видно на картинке, программы имеют родной внешний вид в различных операционных системах.

    Qt имеет среду разработки Qt Creator. Она включает в себя Qt Designer, с помощью которого можно создавать графический интерфейс. Визуальное создание интерфейса позволяет легко и просто создавать интерфейс, перетаскивая различные виджеты(выпадающие списки, кнопки, переключатели) на форму.

    Форма в Qt Designer

    Qt поставляется вместе с Qt Assistant — это огромный интерактивный справочник, содержащий в себе информацию по работе с Qt. К сожалению полностью не переведен на русский. В состав Qt также входит Qt Linguist, которая позволяет локализировать приложение для разных языков.

    Состав библиотеки Qt

    Библиотека Qt состоит из различных модулей, которые подключаются при помощи директивы #include. В состав входят:

    QtCore — классы ядра библиотеки Qt, они используются другими модулями.

    QtGui — модуль содержит компоненты графического интерфейса.

    QtNetwork — модуль содержит классы для работы с сетью. В него входят классы для работы с протоколами FTP, HTPP, IP и другими.

    QtOpenGL — модуль содержит классы для работы с OpenGL

    QtSql — содержит классы для работы с различными базами данных с использованием языка SQL.

    QtSvg — содержит классы, позволяющие работать с данными Scalable Vector Graphics (SVG)

    QtXml — классы для работы с XML

    QtScript — классы для работы с Qt Scripts

    Имеются и другие модули.

    В данный момент Qt распрастраняется по 3-м лицензиям: Qt Commercial(собственическая), GNU GPL, GNU LGPL.

    Заключение

    В настоящее время Qt фреймворк активно развивается. Имеет интуитивно понятное API, огромную документацию с большим количеством примеров, мощнейшую среду разработки QtCreator и дополнительный инструментарий. Этот фреймворк стоит Вашего внимания.

    Для вас это может быть интересно:

    Краткий обзор кроссплатформенного фреймворка Qt : 1 комментарий

    Использую его при написании графических приложений для Linux, классная штука. Жаль литературы нет русскоязычной для последней версии.

    Добавить комментарий Отменить ответ

    Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

    Разработка игры на С++, Qt

    Написал ремейк небольшой логической игрушки — «Полный квадрат». Код показался мне достаточно интересным чтобы описать на блоге.

    По сюжету игры, ёжик перемещается по лабиринту из облаков. Ходить ёж умеет только по вертикали и горизонтали, а начав движение идет до тех пор, пока не упрется в пустоту (пройденные облака исчезают), край экрана или грозовую тучу. Необходимо выбрать начальную позицию для ежа и такой маршрут движения, чтобы все облака оказались пройдены.

    В любой игре, чуть более интересной чем «Сапер«, используются анимации, проигрывается звук, поэтому следующие компоненты Qt затронуты в статье:

    • класс QMovie для отображения gif-анимации тучек и ежа;
    • класс QPropertyAnimation — ежик перемещается плавно, при этом меняются его координаты (свойства);
    • QMediaPlayer из модуля Qt Multimedia. При перемещении наш ёжик топает;
    • Qt Style Sheets (QSS) используется для украшения элементов управления.

    снимки игровых экранов

    Содержание:

    Архитектура игры

    Игра состоит из нескольких экранов, которыми управляет ScreenController. Экраны я рисовал с использованием Qt Designer [1]. Каждый игровой экран содержит кнопки, позволяющие перейти на другой экран, события от которых передаются контроллеру.

    Логика игры вынесена в класс GameWidget, который загружает на графическую сцену блоки и как-то обрабатывает их сигналы. Например, если на сцене уже размещен ёжик и пользователь кликнул облачко, то GameWidget обеспечивает перемещение ежа в новую позицию при условии, что это не будет противоречить правилам игры.

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

    WinScreen выводит информацию о победе и предлагает сыграть в игру еще раз.

    Qt Style Sheets (QSS)

    При рисовании интерфейса в Qt Designer использованы самые обычные кнопки текстовые поля. Скругленные углы кнопок, цвет и размер рамки, изменение цвета при наведении и нажатии мыши получены за счет использования таблиц стилей Qt.

    Установить таблицу стилей виджету (QWidget) или приложению (QApplication) можно методом setStyleSheet(). Для стилизации уже готового приложения можно передать таблицу стилей при запуске вместе с соответствующей опцией (-stylesheet style.qss). Таблица стилей Qt являются надстройкой над каскадными таблицами стилей, используемыми при верстке веб страниц (CSS3) [2].

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

    имя класса виджета. Стиль применяется ко всем элементам, которые могут быть приведены к классу с заданным именем;

    имя объекта определенного класса. Стиль применяется только к этому объекту;

    имя класса и свойства объекта. Стиль применяется ко всем объектам класса, обладающими заданным свойством;

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

    В игре стили применяются к объекту класса ScreenController, и автоматически будут распространены на все вложенные виджеты.

    В примере задается цвет фона для всех виджетов, параметры кнопок и текстового поля, а также цвет кнопок, находящихся в определенных псевдосостояниях. Стиль, примененный для QPushButton:disabled будет распространен на все неактивные кнопки.

    При использовании QSS необходимо заглядывать в документацию, чтобы проверить возможность стилизации свойств определенного типа виджета [2], кроме того, в документации описано огромное количество примеров [3].

    Анимация и звук в Qt

    Ежик плавно перемещается, за счет использования QPropertyAnimation, при этом сам ёж при перемещении машет лапками — проигрывается соответствующая .gif-анимация (QMovie).

    Любой элемент игры отображает какую-либо анимацию, поэтому в класс Block включены соответствующие поля и метод установки анимации.

    Класс блок агрегирует экземпляр QLabel, на котором и отображается анимация. QMovie поддерживает кеширование, которое по умолчанию отключено. При кешировании, в память помещается не следующий кадр, а пачка кадров, поэтому сокращаются затраты на их переключение. В приведенном фрагменте используется метод jumpToFrame(), устанавливающий текущий кадр, который не должен использоваться при включенном кешировании, однако в нашем случае он производит лишь установку начального кадра анимации и никогда не переключает кадры во время проигрывания.

    Я уже рассказывал про графическую сцену в Qt [4], но в тот раз на сцене размещались экземпляры QGraphicsItem, но они не являются наследниками QWidget и не могут включать в себя виджеты (которым является QLabel, используемый для отображения анимации). В связи с этим, все наши ежи и облачка являются виджетами, а вместо QGraphicsScene::addItem() используется метод QGraphicsScene::addWidget(), создающий экземпляр QGraphicsProxyWidget, который и добавляется на сцену. Независимо от того, в какой позиции находился виджет до добавления, на сцене он окажется в левом верхнем углу. При добавлении на сцену QGraphicsProxyWidget копирует состояние исходного виджета, после этого состояние виджета всегда будет соответствовать состоянию прокси и наоборот — например, если скрыть виджет методом hide() — то скрыт будет и соответствующий прокси. При освобождении памяти из под прокси, будет удален исходный виджет. У класса QWidget имеется метод для получения соответствующего прокси — QWidget::graphicsProxyWidget().

    В нашей игре, за добавление виджетов на сцену отвечает виртуальный метод GameWidget::itemAdd(), принимающий тип добавляемого виджета и создающий экземпляр соответствующего класса. В классе GameHelpWidget этот метод перегружается для обработки элементов нового типа. После добавления элемента на сцену, выполняется метод move(), т.к. иначе виджет останется в левом верхнем углу сцены.

    Класс QPropertyAnimation позволяет анимировать свойства объекта, при этом указываются начальное и конечное значения свойства и время, за которое изменение должно произойти. QPropertyAnimation рассчитывает новое значение свойства, а по приходу сигнала от таймера (который есть внутри любого QObject) изменяет свойство и запрашивает перерисовку объекта. Под свойствами тут имеется ввиду любое Q_PROPERTY, в том числе, определенное пользователем — так, например, если бы мы разрабатывали виджет, моделирующий работу чашечных весов, рационально бы было определить угол наклона весов в виде свойства, а анимацию поворота рычага выполнять с помощью стандартного QPropertyAnimation. В нашей игре требуется плавно изменять координаты ёжика, а по окончанию анимации выполнять проверки на счет того, что ёж мог оказаться в тупике — проиграл, или обошел все клетки — выиграл.

    В конструкторе QPropertyAnimation указывается объект, свойство которого требуется изменять и имя свойства. Кроме того, может быть указан родительский объект, при разрушении которого из под анимации будет освобождена память — это удобно, если время проигрывания анимации совпадает со временем жизни какого-то объекта, но т.к. у нас такого класса нет — память освобождается в слоте-обработчике завершения анимации.

    Во время перемещения ежа проигрывается трек с топотом. Для проигрывания звука используем класс QMediaPlayer.

    QMediaPlaylist позволяет создать список проигрывания и управлять ими. В приведенном фрагменте трек всего один, а QMediaPlaylist используется для зацикливания проигрывания музыки.

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

    • пришлось отказаться от QMovie и анимации в gif-формате, т.к. пользователи телефонов начали жаловаться на низкое качество картинки, обусловленное сжатием gif;
    • исходный код был улучшен с точки зрения гибкости и удобства добавления новых возможностей — я планировал доработать игру добавив новые типы блоков, но руки не дойдут до этого — основная проблема в художнике, который опять попросит кучу денег за анимации и в огромном количестве времени, которое придется потратить на составление новых уровней;

    Скачать игру и ее исходный код можно в по ссылке.

    Программист C++ Qt M >Разработка ПОСтарший (Senior)

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

    Приглашаем на постоянную работу ведущего инженера программиста, способного обеспечить разработку качественного программного обеспечения.

    Должностные обязанности:

    1. Проектирование, разработка и модификация программного обеспечения комплексных систем безопасности;
    2. Разработка программных решений для интеграции различного оборудования собственной разработки (средств охраны, в том числе мобильных, интеллектуального видеонаблюдения и т. д.), реализация алгоритмов обработки, передачи и хранения данных;
    3. Выполнения задач от разработки архитектуры и алгоритмов работы до code review, тестирования и подготовки к внедрению;
    4. Возможны редкие командировки по России.

    Специфика работы:

    • Основной язык: С++ (Qt);
    • Операционная система AstraLinux;
    • Используемые протоколы RS-232/RS-485, ModBus, Ethernet (TCP/IP);
    • СУБД Berkeley DB;
    • Автоматизированная сборка и тестирование программного обеспечения.

    Задачи:

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

    Пожелания к кандидатам:

    • Уверенное знание языка C++ (включая знания многопоточности, сетевого программирования);
    • Опыт разработки GUI приложений с помощью библиотек Qt;
    • Умение писать хороший — «читаемый» и документированный код;
    • Здоровый рабочий энтузиазм;
    • Трудолюбие, ответственность;
    • Аккуратность, внимательность к деталям;
    • Развитое логическое мышление;
    • Письменная грамотность;
    • Опыт разработки для Linux;
    • Российское гражданство.

    Условия:

    • Работа по решению сложных задач с применением перспективных технологий и решений;
    • Гибкий график работы;
    • Корпоративная мобильная связь, современное оснащение рабочего места;
    • Офис в шаговой доступности от м. Домодедовская;
    • Парковка;
    • Замечательная и не дорогая столовая, спортивный зал;
    • Своевременная и стабильная заработная плата;
    • Оформление по ТК, белая заработная плата.
    Цукерберг рекомендует:  Вакансии Owl-Studio
    Понравилась статья? Поделиться с друзьями:
    Все языки программирования для начинающих