Приложение не удалось запустить, поскольку оно не могло найти или загрузить плагин платформы QT “окна”,

Название: Qt 5.10. Профессиональное программирование на С++

image

Название книги: Qt 5.10. Профессиональное программирование на С++ Автор: Шлее М. Год: 2018 Издательство: БХВ-Петербург ISBN 978-5-9775-3678-3 Страниц: 1072 Язык: Русский Формат: PDF Размер: 99 Mb

Содержание: Книга посвящена разработке приложений для Windows, Mac OS X, Linux, Android и iOS с использованием библиотеки Qt версии 5.10.

Подробно рассмотрены возможности, предоставляемые этой библиотекой, и описаны особенности, выгодно отличающие ее от других библиотек. Описана интегрированная среда разработки Qt Creator и работа с технологией Qt Quick.

Книга содержит исчерпывающую информацию о классах Qt 5, и так же даны практические рекомендации их применения, проиллюстрированные на большом количестве подробно прокомментированных примеров.

Мета теги:

Одним из инструментов для создания приложений с графическим пользовательским интерфейсом является хорошо известный фреймворк Qt. Кроссплатформенность Qt позволяет нам успешно использовать его в том числе и для разработки на Raspberry Pi. Но здесь есть один нюанс, о котором мы и поговорим в этой статье.

В принципе, можно без проблем установить Qt Creator и сопутствующие библиотеки непосредственно на Raspberry. И, соответственно, на самой же плате и заниматься разработкой. Но! Компиляция требует достаточно серьезных мощностей, в связи с чем этот процесс на Raspberry будет занимать довольно продолжительное время, что, естественно, нежелательно.

Решение данной проблемы такое — разработка и дальнейшая компиляция выполняются на ПК, а уже готовое приложение загружается и используется на Raspberry Pi. Для реализации этого нам нужно будет кросс-компилировать Qt на хост-компьютере, чтобы затем можно было разворачивать и отлаживать приложения уже на плате. Итак, в отправной точке у нас в наличии:

  • Raspberry Pi 4 с установленной Raspberry Pi OS.
  • Хост — ПК с ОС Ubuntu 20.04.
  • Подключение по SSH.

В дальнейшем часть команд будут выполняться на ПК, а часть — на Raspberry Pi, поэтому во избежание путаницы для каждой команды и каждого шага будем добавлять наглядные метки: [PC] или [Raspberry Pi] .

Кросс-компиляция Qt.

Шаг 1. [Raspberry Pi]

Произведем необходимые настройки:

sudo raspi-config

Первым делом, включаем поддержку OpenGL driver with fake KMS. Для этого переходим в Advanced Options — GL Driver:

И второй момент — настраиваем Raspberry Pi OS на загрузку без запуска графической оболочки. Идем в System Options — Boot / Auto Login:

Шаг 2. [Raspberry Pi]

Редактируем файл /etc/apt/sources.list, например, при помощи редактора nano:

sudo nano /etc/apt/sources.list

Нашей целью здесь является раскомментирование строки:

deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi

Шаг 3. [Raspberry Pi]

Обновляем систему и устанавливаем необходимые библиотеки:

sudo apt-get update  sudo apt-get upgrade  sudo apt-get build-dep qt5-qmake sudo apt-get build-dep libqt5gui5 sudo apt-get build-dep libqt5webengine-data sudo apt-get build-dep libqt5webkit5 sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0 gdbserver pkg-config mesa-utils libgles2-mesa-dev libdrm.dev libgbm.dev

Шаг 4. [Raspberry Pi]

Создаем на Raspberry Pi папку для пользователя pi для дальнейшего развертывания в ней Qt:

sudo mkdir /usr/local/qt sudo chown pi:pi /usr/local/qt

Шаг 5. [PC]

Теперь создаем папку на хосте и скачиваем тулчейн для кросс-компиляции:

mkdir ~/raspberrypi cd ~/raspberrypi wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz tar xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

У меня 64-битная ОС, соответственно, версия — x86_64.

Шаг 6. [PC]

Создаем sysroot для кросс-компиляции под Raspberry Pi:

mkdir sysroot sysroot/usr sysroot/opt

Шаг 7. [PC]

Синхронизируем sysroot на ПК с Raspberry Pi:

rsync -avz pi@192.168.0.101:/lib sysroot rsync -avz pi@192.168.0.101:/usr/include sysroot/usr rsync -avz pi@192.168.0.101:/usr/lib sysroot/usr rsync -avz pi@192.168.0.101:/opt/vc sysroot/opt

Соответственно, здесь и далее имя пользователя (pi) и ip-адрес платы (192.168.0.101) нужно заменить на свои.

Шаг 8. [PC]

Заменяем символьные ссылки sysroot на относительные при помощи готового скрипта sysroot-relativelinks.py. Скачиваем скрипт и запускаем:

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py chmod +x sysroot-relativelinks.py ./sysroot-relativelinks.py sysroot

Шаг 9. [PC]

Скачиваем исходники Qt. Будем использовать LTS версию 5.15.1:

git clone git://code.qt.io/qt/qtbase.git -b 5.15.1 cd qtbase

Шаг 10. [PC]

Выполняем конфигурацию перед сборкой. Для Raspberry Pi 4 аргументом -device будет linux-rasp-pi4-v3d-g++:

./configure -release -opengl es2  -eglfs -device linux-rasp-pi4-v3d-g++ -device-option CROSS_COMPILE=~/raspberrypi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -sysroot ~/raspberrypi/sysroot -prefix /usr/local/qt -extprefix ~/raspberrypi/qt -hostprefix ~/raspberrypi/host-qt -opensource -confirm-license -skip qtscript -skip qtwayland -skip qtwebengine -nomake tests -make libs -pkg-config -no-use-gold-linker -v -recheck

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

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

git clean -dfx

Шаг 11. [PC]

Приготовления закончены, собираем:

make -j8 make install

Шаг 12. [PC]

Разворачиваем собранный Qt на Raspberry Pi:

cd ~/raspberrypi rsync -avz qt pi@192.168.0.101:/usr/local

И на этом процесс завершен! Переходим к следующему аспекту — установке, запуску и настройке Qt Creator.

Qt Creator для Raspberry Pi.

Шаг 1. [PC]

Установка проста:

sudo apt install qtcreator

Шаг 2. [PC]

Добавляем устройство в Qt Creator. Переходим в меню Tools — Options, открываем раздел Devices и добавляем Generic Linux Device:

Здесь мы задали имя устройства, ip-адрес и имя пользователя. Кроме того, указываем приватный SSH-ключ для доступа к Raspberry Pi по SSH.

Шаг 3. [PC]

Идем в раздел Kits на вкладку Compilers и добавляем компиляторы для C и C++:

Шаг 4. [PC]

В том же разделе на вкладке Debuggers добавляем отладчик для работы с Raspberry. Но для этого предварительно устанавливаем:

sudo apt-get install gdb-multiarch

А затем уже возвращаемся в Debuggers:

Шаг 5. [PC]

Дальше по списку вкладка Qt Versions, где мы добавляем версию Qt:

Шаг 6. [PC]

И финишируем на вкладке Kits, добавив набор инструментов, которые мы будем использовать для Raspberry Pi. Собственно, систематизируем все, что мы добавили ранее:

Теперь при создании нового проекта будет доступен созданный набор, названный нами — Raspberry Pi. В общем-то, как раз и переходим к созданию тестового проекта.

Создание проекта.

Шаг 1. [PC]

Создаем проект и выбираем добавленный ранее набор инструментов:

Шаг 2. [PC]

В настройках проекта в .pro файле можно задать путь для установки приложения на Raspberry Pi. К примеру:

# Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /home/pi/Qt_Projects/$${TARGET} !isEmpty(target.path): INSTALLS += target

То есть в данном случае созданное приложение будет развернуто в папке /home/pi/Qt_Projects/ на Raspberry Pi.

Шаг 3. [PC]

Создаем простейшее приложение с одной кнопкой. По нажатию кнопки, а также в конструкторе и деструкторе MainWindow выдаем сообщение через qDebug().

Собираем приложение и разворачиваем на Raspberry Pi:

Итогом будет успешный запуск на Raspberry:

Собственно, цель достигнута!

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

error: variable has incomplete type 'QApplication' error: unknown type name 'MainWindow'

Часто это связано с тем, что Ubuntu 20.04 по умолчанию использует clang-10. А Qt требует clang-8. Поэтому для устранения ошибок выполняем последовательно:

sudo apt install clang-8 sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-8 100 sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-8 100

Вот на этом точно все, спасибо за внимание и до скорого!

Толкование

Qt Creator
Qt Creator
Окно редактора кода Qt Creator 2.5.1
Тип

Среда разработки программного обеспечения

Разработчик

Qt Development Frameworks

Написана на

C, C++[1], QML

Операционная система

Кроссплатформенное программное обеспечение

Последняя версия

2.6.0[2] (8 ноября 2012)

Лицензия

LGPL 2.1

Сайт

http://qt.digia.com/product/developer-tools/

Qt Creator (ранее известная под кодовым названием Greenhouse) — кроссплатформенная свободная IDE для разработки на С, С++ и QML. Разработана Trolltech (Nokia) для работы с фреймворком Qt. Включает в себя графический интерфейс отладчика и визуальные средства разработки интерфейса как с использованием QtWidgets, так и QML. Поддерживаемые компиляторы: Gcc, Clang, MinGW, MSVC, Linux ICC, GCCE, RVCT, WINSCW[3].

Особенности

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

Работа с проектами

Qt Creator поддерживает проекты систем qmake и cmake, начиная с версии 2.5 поддерживатеся autotools[4]. Для проектов, созданных под другими системами, может использоваться в качестве редактора исходных кодов. Есть возможность редактирования этапов сборки проекта.

Также IDE нативно поддерживает системы контроля версии, такие как Subversion, Mercurial, Git, CVS, Bazaar, Perforce. Начиная с версии 2.5, в поле комментария к правке поддерживается автодополнение.

Редактирование кода

В Qt Сreator реализовано автодополнение[5], в том числе ключевых слов, введённых в стандарте C++11 (начиная с версии 2.5), подсветка кода (её определение аналогично таковому в Kate, что позволяет создавать свои виды подсветок или использовать уже готовые). Также, начиная с версии 2.4, есть возможность задания стиля выравнивания, отступов и постановки скобок.

Реализован ряд возможностей при работе с сигнатурами методов, а именно:

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

Среда разработки имеет графический интерфейс для следующих отладчиков: GDB, CDB и QML/JavaScript. В качестве отдельной опции реализовано отображение содержимого контейнеров, таких как QString, std::map и прочих. Поддерживаются следующие режимы отладки:

  • простой для отладки локально запущенных приложений, таких как GUI приложения на Qt;
  • терминал для отладки локально запущенных процессов, которым требуется консоль, обычно это приложения без GUI;
  • подключённый для отладки локальных процессов, запущенных вне Qt Creator;
  • удалённый для отладки запущенных на другой машине процессов (используя gdbserver);
  • ядро для отладки завершившихся аварийно процессов на Unix;
  • Post-mortem для отладки завершившихся аварийно процессов на Windows;
  • TRK для отладки процессов, запущенных на устройстве Symbian.

Точки остановки можно задать различными способами, а именно:

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

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

Архитектура

Функция main по сути своей — вызов загрузчика плагинов, которые и реализуют весь функционал. Поэтому все компоненты QtCreator так или иначе связаны с плагинами[6].

ExtensionSystem представляет интерфейс для разработки плагинов, обеспечивает загрузку плагинов и базовое взаимодействие. Содежит в себе класс-интерфейс IPlugin, от которого должны наследоваться все плагины в программе.

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

Utils — библиотека утилит, которые могут вызывать плагины.

QmlJS — библиотека для поддержки QML и JavaScript.

Примечания

  1. Qt Creator
  2. Qt Creator 2.6.0 released
  3. Qt Creator : Adding Tool Chains
  4. Qt Creator : Using Other Build Systems
  5. начиная с версии 2.5.1 устранена проблема автодополнения функций шаблонных классов
  6. Qt Creator : Qt Creator API Reference

Ссылки

Полезное

Смотреть что такое “Qt Creator” в других словарях:

  • Creator ownership — is an arrangement in which the creator or creators of a work of fiction retain full ownership of the material, regardless of whether it is self published or by a corporate publisher. In some fields of publishing, such as fiction writing, creator… …   Wikipedia

  • Creator (song) — Creator Single by Santogold featuring Switch Freq Nasty from the album Santogold A side …   Wikipedia

  • creator — CREATÓR, OÁRE, creatori, oare, adj., s.m. şi f. 1. adj., s.m. şi f. (Persoană) care creează, care fundează ceva. 2. s.m. (În concepţiile religioase) Dumnezeu. [pr.: cre a ] – Din fr. créateur, lat …   Dicționar Român

  • Creator — may refer to: Creator deity, a deity responsible for creating the universe Inventor, one who creates a new device or method A person who experiences or participates in creativity An adherent of Church of the Creator, a new age religion An… …   Wikipedia

  • Creator Mundi — Creator Mundi, Inc. Type Privately held company Industry Retail Founded 1988 Headquarters Littleton, Colorado, USA Key people …   Wikipedia

  • Creator (album) — Creator Studio album by The Lemonheads Released 1988 (original LP) 1992 (extended CD reissue, with three live bonus tracks) …   Wikipedia

  • Creator (film) — Creator Theatrical release poster Directed by Ivan Passer Produced by Stephen J. Fri …   Wikipedia

  • creator — c.1300, Supreme Being, from Anglo Fr. creatour, O.Fr. creator (12c., academic and liturgical, alongside popular creere, Mod.Fr. créateur), from L. creator creator, author, founder, from creatus (see CREATE (Cf. create)). Translated in O.E. as… …   Etymology dictionary

  • Creator — est un film américain réalisé par Ivan Passer, sorti en 1985. Sommaire 1 Synopsis 2 Fiche technique 3 Distribution 4 Autour du film …   Wikipédia en Français

  • creator — [krē āt′ər] n. [ME creatour < L creator] one who creates the Creator God; the Supreme Being …   English World dictionary

  • Creator — Cre*a tor (kr[ e]*[=a] t[ e]r), n. [L. creator: cf. F. cr[ e]ateur.] One who creates, produces, or constitutes. Specifically, the Supreme Being. [1913 Webster] To sin s rebuke and my Creater s praise. Shak. [1913 Webster] The poets and artists of …   The Collaborative International Dictionary of English

Книги

  • Creator. Выпуск II, Барышников Александр Петрович. Второй выпуск`Creator`а` продолжает обсуждение проблемы Сущности и Существования Информации (жизни). В этой книге выдвигается гипотеза (версия) возможности возникновения жизни естественным,… Подробнее  Купить за 498 грн (только Украина)
  • Creator. Выпуск II, Барышников Александр Петрович. Второй выпуск “Creator’а” продолжает обсуждение проблемы Сущности и Существования Информации (жизни). В этой книге выдвигается гипотеза (версия) возможности возникновения жизни естественным,… Подробнее  Купить за 467 руб
  • Creator-Owned Heroes: American Muscle: Part 1: Trigger Girl 6: Part 1, Steve Niles, Jimmy Palmiotti, Justin Gray. “American Muscle,” Part One by Steve Niles&Kevin Mellon. The world ended a long time ago. How it happened exactly and what exists in the wasteland have always been a mystery. Now Chloe, Gil… Подробнее  Купить за 441 руб

Другие книги по запросу «Qt Creator» >>

    Как оказалось, скачав лишь Qt libraries 4.8.5 for Windows (minGW 4.4, 317 MB), создать свою программу на Qt не удастся. Помимо этого файла, в первую очередь, нужен рабочий компилятор (для данной версии это MinGW не ниже 4.4), который придется устанавливать отдельно, и скачать уже готовый. Среда разработки (Qt Creator 3.1.0 for Windows (68 MB)) оказалась поставляется вне библиотек Qt 4.8.5 и тоже требует отдельной установки. Ну и напоследок, если собираетесь запускать свою программу в отладчике по шагам (а я уверен, что рано или поздно придется это делать), то необходим еще и свой отладчик (GDB имеющийся в MinGW не подходит)     А теперь обо всем по порядку.

    Последовательность действий:

1. Установка компилятора C++ MinGW.     Можно воспользоваться способом установки через инсталятор. Но для новичка он труден. Я предлагаю поступить проще – скачать уже готовый настроенный и проверенный пакет всего необходимого для компиляции проектов Qt на C++. 1.1. Скачиваем: mingw_4.4.0.zip. 1.2. Создаем папку Qt в корне системного раздела (диск C:) и переносим в нее папку MinGW и всё ее содержимое из скачанного архива. 2. Установка библиотек Qt 4.8.5 2.1. Скачиваем их: Qt libraries 4.8.5 for Windows (minGW 4.4, 317 MB). 2.2. Запускаем скачанный exe-файл. 2.3. В процессе установки указываем: путь куда установить: C:Qt4.8.5 путь до MinGW: C:QtMinGW остальное по умолчанию 3. Установка среды разработки Qt Creator 3 3.1. Скачиваем её: Qt Creator 3.1.0 for Windows (68 MB). 3.2. Запускаем скачанный exe-файл. 3.3. В процессе установки указываем: путь куда установить: C:QtCreator3 остальное по умолчанию 4. Установка отладчика GDB 7.7 для Qt     Почему-то Qt не нравится тот gdb, который имеется в пакете MinGW. Qt хочет свой отладчик, по своему настроенный. И его вы можете собрать используя эту статью. Я собирал именно по этой статье (разве что пришлось заменить файл из исходников – srcdistgdbMakefile.mingw, на последний Makefile.mingw с сайта https://qt.gitorious.org/qt). Но я предлагаю использовать уже собранный мной GDB. 4.1. Скачиваем его: Qt_GDB7.7.zip (13 MB). 4.2. Переносим в С:Qt папку Qt_GDB7.7 и всё ее содержимое из скачанного архива. 5. Настройка Qt 4.1. Запускаем Qt Creator 4.2. Открываем окно Параметров во вкладке Инструменты. 4.3. Выбираем в правом меню строку Сборка и запуск. 4.4. Начнем с конца. Переходим на вкладку Отладчики. 4.5. Нажимаем кнопку Добавить, даем название GDB и указываем путь: C:QtQt_GDB7.7gdb-i686-pc-mingw32.exe 4.6. Применить 4.7. Вкладка Компиляторы -> кнопка Добавить -> MinGW. 4.8. Указываем путь к компилятору: C:QtMinGWbingcc.exe 4.9. Остальное не трогаем. Применить. 4.10. Вкладка Профили Qt -> кнопка Добавить. 4.11. Указываем путь до qmake: C:Qt4.8.5binqmake.exe 4.12. Изменим название на Qt 4.8.5 4.13. Остальное не трогаем. Применить. 4.14. Вкладка Комплекты. Удаляем комплект Desktop (по умолчанию), если имеется. 4.15. Нажимаем кнопку Добавить. Присваиваем имя: Qt 4.8.5 (MinGW). 4.16. В строках Компилятор, Отладчик и Профиль Qt указываем только что созданные параметры. 4.17. Остальное не трогаем. Применить. 4.18. ОК     Всё, теперь можно начать создавать программы использую библиотеку Qt и среду разработки Qt Creator.     Для начала можете запустить этот тестовый проект “Hello, World” (взят из книги М.Шлее)     Кстати, Qt не поддерживает русских символов в пути до проектов. А все проекты советую хранить в созданной специально для этого папке C:QtProjects. Для запуска этого проекта просто распакуйте его (папку Hello и два имеющихся в ней файла) и запустите проектный файл Hello.pro с помощью Qt Creator. Среда разработки предложит настроить его. С её предложением мы согласимся, оставим как есть, и нажмем кнопку Настроить проект:     Можно открыть редактор кода и в нем отредактировать один имеющийся там файл main.cpp. Или сразу скомпилировать проект нажав на зеленый треугольник в левом нижнем углу окна или нажав комбинацию +.     Если получим вот такое вот окошко, то значит все сделали правильно и можно начинать создавать свои программы: Используемый и полезный материал: Download Qt _ Qt Project Qt С чего начать Курс ‘Компьютерная Графика’ В поддержку Qt – Установка Qt 4 В поддержку Qt – Установка MinGW В поддержку Qt – Сборка отладчика GDB При копировании статьи просьба указывать источник и автора. С уважением, GRomR1.     Как оказалось, скачав лишь Qt libraries 4.8.5 for Windows (minGW 4.4, 317 MB), создать свою программу на Qt не удастся. Помимо этого файла, в первую очередь, нужен рабочий компилятор (для данной версии это MinGW не ниже 4.4), который придется устанавливать отдельно, и скачать уже готовый. Среда разработки (Qt Creator 3.1.0 for Windows (68 MB)) оказалась поставляется вне библиотек Qt 4.8.5 и тоже требует отдельной установки. Ну и напоследок, если собираетесь запускать свою программу в отладчике по шагам (а я уверен, что рано или поздно придется это делать), то необходим еще и свой отладчик (GDB имеющийся в MinGW не подходит)     А теперь обо всем по порядку.

    Последовательность действий:

1. Установка компилятора C++ MinGW.     Можно воспользоваться способом установки через инсталятор. Но для новичка он труден. Я предлагаю поступить проще – скачать уже готовый настроенный и проверенный пакет всего необходимого для компиляции проектов Qt на C++. 1.1. Скачиваем: mingw_4.4.0.zip. 1.2. Создаем папку Qt в корне системного раздела (диск C:) и переносим в нее папку MinGW и всё ее содержимое из скачанного архива. 2. Установка библиотек Qt 4.8.5 2.1. Скачиваем их: Qt libraries 4.8.5 for Windows (minGW 4.4, 317 MB). 2.2. Запускаем скачанный exe-файл. 2.3. В процессе установки указываем: путь куда установить: C:Qt4.8.5 путь до MinGW: C:QtMinGW остальное по умолчанию 3. Установка среды разработки Qt Creator 3 3.1. Скачиваем её: Qt Creator 3.1.0 for Windows (68 MB). 3.2. Запускаем скачанный exe-файл. 3.3. В процессе установки указываем: путь куда установить: C:QtCreator3 остальное по умолчанию 4. Установка отладчика GDB 7.7 для Qt     Почему-то Qt не нравится тот gdb, который имеется в пакете MinGW. Qt хочет свой отладчик, по своему настроенный. И его вы можете собрать используя эту статью. Я собирал именно по этой статье (разве что пришлось заменить файл из исходников – srcdistgdbMakefile.mingw, на последний Makefile.mingw с сайта https://qt.gitorious.org/qt). Но я предлагаю использовать уже собранный мной GDB. 4.1. Скачиваем его: Qt_GDB7.7.zip (13 MB). 4.2. Переносим в С:Qt папку Qt_GDB7.7 и всё ее содержимое из скачанного архива. 5. Настройка Qt 4.1. Запускаем Qt Creator 4.2. Открываем окно Параметров во вкладке Инструменты. 4.3. Выбираем в правом меню строку Сборка и запуск. 4.4. Начнем с конца. Переходим на вкладку Отладчики. 4.5. Нажимаем кнопку Добавить, даем название GDB и указываем путь: C:QtQt_GDB7.7gdb-i686-pc-mingw32.exe 4.6. Применить 4.7. Вкладка Компиляторы -> кнопка Добавить -> MinGW. 4.8. Указываем путь к компилятору: C:QtMinGWbingcc.exe 4.9. Остальное не трогаем. Применить. 4.10. Вкладка Профили Qt -> кнопка Добавить. 4.11. Указываем путь до qmake: C:Qt4.8.5binqmake.exe 4.12. Изменим название на Qt 4.8.5 4.13. Остальное не трогаем. Применить. 4.14. Вкладка Комплекты. Удаляем комплект Desktop (по умолчанию), если имеется. 4.15. Нажимаем кнопку Добавить. Присваиваем имя: Qt 4.8.5 (MinGW). 4.16. В строках Компилятор, Отладчик и Профиль Qt указываем только что созданные параметры. 4.17. Остальное не трогаем. Применить. 4.18. ОК     Всё, теперь можно начать создавать программы использую библиотеку Qt и среду разработки Qt Creator.     Для начала можете запустить этот тестовый проект “Hello, World” (взят из книги М.Шлее)     Кстати, Qt не поддерживает русских символов в пути до проектов. А все проекты советую хранить в созданной специально для этого папке C:QtProjects. Для запуска этого проекта просто распакуйте его (папку Hello и два имеющихся в ней файла) и запустите проектный файл Hello.pro с помощью Qt Creator. Среда разработки предложит настроить его. С её предложением мы согласимся, оставим как есть, и нажмем кнопку Настроить проект:     Можно открыть редактор кода и в нем отредактировать один имеющийся там файл main.cpp. Или сразу скомпилировать проект нажав на зеленый треугольник в левом нижнем углу окна или нажав комбинацию +.     Если получим вот такое вот окошко, то значит все сделали правильно и можно начинать создавать свои программы: Используемый и полезный материал: Download Qt _ Qt Project Qt С чего начать Курс ‘Компьютерная Графика’ В поддержку Qt – Установка Qt 4 В поддержку Qt – Установка MinGW В поддержку Qt – Сборка отладчика GDB При копировании статьи просьба указывать источник и автора. С уважением, GRomR1.

Tags:  Qt C++ Visual Studio Hello World

Введение Инсталляция библиотеки Qt в  Visual Studio Qt GUI приложение «Hello, World!» Signals и slots. Обработка событий Qt Desiner. Создание GUI в интерактивном режиме Полезные ссылки

Сегодня практически невозможно представить приложение, в котором нет графического интерфейса пользователя (GUI -Graphical User Interface). Windows API обладает необходимыми инструментами для создания GUI. Однако их использование требует больших затрат времени и практического опыта. Даже библиотека MFC, которая призвана облегчить процесс написания GUI приложений на С++ для ОС Windows, не дает той простоты и легкости создания программ, как хотелось бы. Но самый большой недостаток этих инструментов и библиотек — это платформозависимость. В отличие от MFC библиотека Qt кроссплатформенная. При этом она предоставляет возможности создавать GUI в интерактивном режиме.

Библиотека Qt — это множество классов (более 500), которые определены в модулях, например — QtCore, QtGui, QtWidgets, QtOpenGL. Модуль QtCore в основном отвечает за связь с ОС и управление событиями. Модули QtGui и QtWidgets содержит классы для программирования GUI. Модуль QtOpenGL делает возможным использование OpenGL.

  1. Если у вас еще не установлен Visual Studio, тогда загрузите онлайн-инсталлятор Visual Studio 2017 Community Edition: visualstudio.com/downloads   и с помощью него установите VS (подробнее см. Установка Visual Studio 2017 )
  2. Загружаем файл qt-opensource-windows-x86-5.9.1.exe с официального сайта Qt и запускаем его (подробнее см. Installing Visual Studio 2017 + Qt Interface Library). Библиотека Qt установится в директории  C:/Qt.
  3. Обеспечиваем интеграцию Qt в Visual Studio. Для этого запускаем Visual Studio, выбираем кнопки Tools>Extensions and Updates…  , в открывшемся окне — кнопку Online. В поиске набираем qt, нажимаем кнопку Download, затем кнопку Install (подробнее см.  Как программировать на Qt в Visual Studio 2015  ).
  4. Перезапускаем VS, в меню появилась кнопка Qt VS Tools. Выбираем кнопки Qt VS Tools>Qt Options>Add. В окошко Path копируем путь C:QtQt5.9.15.9.1msvc2017_64.
  5. Создаем проект (File>New>Project), откроется окно для выбора типа проекта, выбираем Qt Console Application:

image

В открывшемся окне для выбора модулей нажимаем кнопки Next>Finish (модули по умолчанию). В результате создается шаблон проекта  со следующим  кодом в файле main.cpp:

image

Запускаем программу (клавиша F5). Тест пройден успешно, если открывается окно консоли:

image

Если при запуске возникают ошибки, вероятнее всего это связано с отсутствием каких-либо необходимых компонентов в VS. Запустите снова онлайн-инсталлятор Visual Studio 2017 и доустановите их в соответствии с рекомендациями (см. Установка Visual Studio 2017 и  Installing Visual Studio 2017 + Qt Interface Library).

Давайте распечатаем «Hello World», изменив исходный файл:

#include     int main (int argc, char * argv [])  {      QCoreApplication a (argc, argv);       qDebug () << "Hello World";</span>      return a.exec ();  }

Класс QCoreApplication предоставляет цикл обработки событий для консольных приложений Qt.  Для приложений с графическим интерфейсом мы будем использовать QApplication. При вызове a.exec () запускается цикл обработки событий.

Создаем проект Qt GUI приложения (File>New>Project>Visual C++>Qt>Qt GUI  Application>OK>Next>Next>Finish). Получаем шаблон приложения с заготовленным кодом. Запускаем его, открывается окно:

image

Посмотрим на исходный код в файлах проекта:

Файл main.cpp

#include "QtGuiApplication2.h"  #include    int main(int argc, char *argv[])  {   QApplication a(argc, argv);   QtGuiApplication2 w;   w.show();   return a.exec();   }

В первой строке подключается заголовочный файл QtGuiApplication2.h, который  расположен непосредственно в созданном проекте. Во второй строке подключается заголовочный файл QApplication, который  расположен в модуле QtWidgets:

image

В файле main.cpp сначала создается объект класса QApplication, который осуществляет контроль и управление приложением. Для его создания в конструктор этого класса необходимо передать два аргумента. Первый аргумент представляет собой информацию о количестве аргументов в командной строке, с которой происходит обращение к программе, а второй — это указатель на массив символьных строк, содержащих аргументы, по одному в строке. Любая использующая Qt программа с графическим интерфейсом должна создавать только один объект этого класса, и он должен быть создан до использования операций, связанных с пользовательским интерфейсом.  После создания элементы управления Qt по умолчанию невидимы, и для их отображения необходимо вызвать метод show().

В последней строке программы приложение запускается вызовом QApplication::exec(). С его запуском приводится в действие цикл обработки событий, определенный в классе QCoreApplication, являющимся базовым для QApplication. Этот цикл передает получаемые от системы события на обработку соответствующим объектам. Он продолжается до тех пор, пока не будет вызван статический метод QCoreApplication::exit(), либо не закроется окно последнего элемента управления. По завершению работы приложения метод QApplication::exec() возвращает значение целого типа, содержащее код, информирующий о его завершении.

Файл QtGuiApplication2.h

#pragma once  #include   #include "ui_QtGuiApplication2.h"  class QtGuiApplication2 : public QMainWindow  {   Q_OBJECT  public:   QtGuiApplication2(QWidget *parent = Q_NULLPTR);  private:   Ui::QtGuiApplication2Class ui;  };

В первой строке подключается заголовочный файл QMainWindow, который  расположен в модуле QtWidgets.

В файле QtGuiApplication2.h описывается класс QtGuiApplication2, производный от класса QMainWindow, предоставляемого системой Qt.  В разделе public объявляется конструктор.  В разделе private создается переменная ui, через которую устанавливается пользовательский интерфейс.

Макрос Q_OBJECT должен появляться в закрытом разделе описания класса, который объявляет свои собственные signals и slots (см. Signals и slots. Обработка событий) или использует другие сервисы, предоставляемые системой Qt.

Файл QtGuiApplication2.cpp

#include "QtGuiApplication2.h"  QtGuiApplication2::QtGuiApplication2(QWidget *parent):QMainWindow(parent)  {   ui.setupUi(this);  }

В файле QtGuiApplication2.cpp определяется конструктор с передачей параметра parent конструктору базового класса.  Функция setupUi  берет на себя все действия по созданию этого (this) окна.

Изменяем код в файле main.cpp на следующий:

#include "QtGuiApplication2.h"  //#include    int main(int argc, char *argv[])  {   QApplication a(argc, argv);   QtGuiApplication2 w;   w.setWindowTitle("Hello world");   w.show();   return a.exec();   }

Запускаем приложение, получаем результат:

image

Изменяем код в файле main.cpp на следующий:

#include "QtGuiApplication2.h"  #include     int main(int argc, char *argv[])  {   QApplication a(argc, argv);   QLabel label("Hello, World!");   label.show();   QtGuiApplication2 w;  w.setWindowTitle("Hello world");  w.show();   return a.exec();  }

Запускаем приложение, получаем результат:

image

Обеспечим агрегацию, чтобы элемент (виджет) label появлялся не отдельно от окна, а входил в него.  Для этого изменяем код файлов проекта:

Файл main.cpp

#include "QtGuiApplication2.h"  int main(int argc, char *argv[])  {   QApplication a(argc, argv);   QtGuiApplication2 w;   w.setWindowTitle("Hello world");   w.show();   return a.exec();   }

Файл QtGuiApplication2.h

#pragma once  #include  #include   #include "ui_QtGuiApplication2.h"  class QtGuiApplication2 : public QMainWindow  {   Q_OBJECT  public:   QtGuiApplication2(QWidget *parent = Q_NULLPTR);  private:   QLabel *label;   Ui::QtGuiApplication2Class ui;  };

Файл QtGuiApplication2.cpp

#include "QtGuiApplication2.h"  QtGuiApplication2::QtGuiApplication2(QWidget *parent):QMainWindow(parent)  {   label = new QLabel("Hello world", this);  //label->show(); //ui.setupUi(this);  }

image

Для программирования GUI на языке С++  в ОС Windows обычно используется библиотека MFC.  При этом обработка событий реализуется через специальные макросы — так называемые карты сообщений, которые не имеют ничего общего с ООП и весьма неудобны. Проблема обработки событий решена в Qt более эффективно — при помощи механизма сигналов (signals) и слотов (slots).

Представьте себе ситуацию: у вас звонит телефон, и вы реагируете на это снятием трубки. На языке сигналов и слотов подобную ситуацию можно описать следующим образом: объект «телефон» выслал сигнал «звонок», на который объект «человек» отреагировал слотом «снятия трубки».

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

В модели события участвуют три участника:

  • источник события (event source) — объект, состояние которого изменяется, он генерирует события;
  • объект события (event object) — инкапсулирует изменения состояния в источнике события;
  • слушатель события (event target) — объект, который хочет получить уведомление.

Ниже приводится описание приложения, при запуске которого появляется окно с кнопкой. При нажатии на кнопку окно закрывается.

Создадим проект приложения под названием Click и изменим код файлов проекта.

Файл main.cpp

#include "Click.h"  int main(int argc, char *argv[])  {   QApplication app(argc, argv);   Click window;   window.resize(250, 150);   window.setWindowTitle("Click");   window.show();   return app.exec();  }

Файл Click.h

// #include  // #include  // #include   #include   //#include "ui_Click.h"    class Click : public QMainWindow  {   //Q_OBJECT  public:   Click(QWidget *parent = Q_NULLPTR);  private:   QHBoxLayout *hbox;   QPushButton *quitBtn;   //Ui::ClickClass ui;  };

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

Файл Click.cpp

#include "Click.h"  Click::Click(QWidget *parent):QMainWindow(parent)  {   //ui.setupUi(this);   hbox = new QHBoxLayout(this);   hbox->setSpacing(5);   quitBtn = new QPushButton("Quit", this);   hbox->addWidget(quitBtn, 0, Qt::AlignLeft | Qt::AlignTop);   connect(quitBtn, &QPushButton::clicked, qApp, &QApplication::quit);  }

Метод connect () подключает сигнал QPushButton::clicked к слоту QApplication::quit. Здесь QApp — это глобальный указатель на объект приложения. Он определен в заголовочном файле

В общем виде, вызов метода connect() выглядит следующим образом:

QObject::connect(const QObject* sender,                                  const char* signal,                                  const QObject* receiver,                                  const char* slot,                                 Qt::ConnectionType type = Qt::AutoConnection );

Ему передаются пять параметров:

  1. sender — указатель на объект, отправляющий сигнал;
  2. signal — это сигнал, с которым осуществляется соединение;
  3. receiver — указатель на объект, который имеет слот для обработки сигнала;
  4. slot — слот, который вызывается при получении сигнала.
  5.  type — управляет режимом обработки.

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

Далее см. примеры в статье Events and signals in Qt5 :

  • KeyPress
  • QMoveEvent
  • Disconnecting a signal
  • Timer

Создаем проект Qt GUI приложения (File>New>Project>Visual C++>Qt>Qt GUI  Application>OK>Next>Next>Finish). Получаем шаблон приложения с заготовленным кодом. В окне Solution Explore выполняем dblclick на файле QtGuiApplicatin3.ui.

Откроется редактор Qt Desiner. С панели виджетов перетаскиваем на заготовку окна две кнопки Push Button и меняем надписи на кнопках (через dblclick):

Пиктограммой переключаемся из режима работы с виджетами в режим «Изменение сигналов/слотов»

Выполняем настройки соединения сигнала clicked() кнопки Quit со слотом close() через окно настроек. Окно открывается, когда отпускаем левую кнопку мышки  после движения курсора от кнопки Quit.

В окне «Редактор Сигналов/Слотов» (окно расположено справа внизу редактора Qt Desiner) отражается результат соединения сигнала и слота

Сохраняем результаты роботы в редакторе Qt Desiner (Файл>Сохранить), возвращаемся в редактор VS и запускаем приложение:

Нажимаем кнопку «Quit», окно приложения закрывается.

Кнопка «Hello» пока еще не соединена ни с каким слотом. Переключаемся снова в редактор Qt Desiner и подготавливаем новый (нестандартный) слот:

Подключаем новый слот к кнопке «Hello»

Теперь нужно добавить реализацию этого слота (метода slot1 ()) в программном коде:

Изменяем код файлов проекта:

Файл QtGuiApplication3.h

#pragma once    #include   #include "ui_QtGuiApplication3.h"  #include       class QtGuiApplication3 : public QMainWindow  {   Q_OBJECT   std::unique_ptrgmb;  public:   QtGuiApplication3(QWidget *parent = Q_NULLPTR);  private slots:  void slot1()  {  gmb->show();  }  private:   Ui::QtGuiApplication3Class ui;  };

std::unique_ptr – «умный указатель», который получает единоличное владение объектом через его указатель, и разрушает объект через его указатель, когда unique_ptr выходит из области видимости.

Файл QtGuiApplication2.cpp

#include "QtGuiApplication3.h"    QtGuiApplication3::QtGuiApplication3(QWidget *parent)   : QMainWindow(parent)  {   gmb = std::make_unique(this);  gmb->setText("Hello, Qt Desiner");   ui.setupUi(this);  }

Автор: Николай Свирневский

Оцените статью
Рейтинг автора
4,8
Материал подготовил
Егор Новиков
Наш эксперт
Написано статей
127
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий