Консольное приложение qt как завершить

Обновлено: 06.07.2024

На этом уроке мы познакомимся с кроссплатформенным фреймворком Qt и установим IDE для работы с ним.

Введение в Qt

Qt является кроссплатформенным (не зависящим от платформы/ОС) фреймворком для разработки приложений на языке С++. С помощью Qt были разработаны такие известные приложения, как: KDE, Opera, Google Earth и Skype. Впервые Qt был опубликован в мае 1995 года.

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

Изначально Qt был разработан норвежской компанией по разработке программного обеспечения Trolltech. В 2008 году компанию приобрела Nokia. Спустя четыре года в августе 2012 программные технологии Qt выкупила финская компания-разработчик Digia. Сейчас Qt развивается компанией QT Company, которая является дочерней компанией Digia, и как проект Qt под открытым исходным кодом с участием отдельных разработчиков и фирм.

Установка Qt Creator в Linux

Шаг №1: Мы будем устанавливать IDE с открытым исходным кодом. Для этого переходим по ссылке и выбираем самую свежую версию (на момент написания данной статьи — это Qt 5.13):



После окончания загрузки переходим в папку с необходимым нам файлом, нажимаем на него правой кнопкой мыши и выбираем "Свойства" . На вкладке "Основные" видим "Имя" , "Тип" , "Размер файла" , а также наименование родительской папки:


Переходим на вкладку "Права" и ставим галочку возле пункта "Разрешить выполнение файла как программы" :


Закрываем "Свойства" и запускаем программу.

Шаг №2: На следующем этапе установщик сообщает, что нам предоставлена версия с открытым исходным кодом Qt 5.13.0. Дальнейшая установка Qt предполагает регистрацию в Qt и создание Qt Account, который предоставляет доступ ко всем возможностям Qt. Кроме того, данное действие необходимо для проверки лицензии (коммерческая/некоммерческая). Если у вас уже есть учетная запись в Qt Account, то используйте кнопку "Next" .

Если учетной записи в Qt Account у вас еще нет, то её можно создать сейчас: для этого перейдите по соответствующей ссылке в установщике, и вы будете перенаправлены на сайт qt.io в соответствующий раздел, или просто используйте кнопку "Next" — вы сможете это сделать на следующем шаге:


Шаг №3: Здесь необходимо ввести логин и пароль от Qt Account или создать Qt Account, если его у вас еще нет. Кнопка "Next" переводит нас на следующий этап:



Шаг №4: Выбираем каталог для установки Qt 5.13.0. Обратите внимание, адрес каталога указывается латинскими буквами (без кириллицы) и без пробелов! После того, как выбрали каталог, нажимаем "Далее >" :


Шаг №5: Выбираем компоненты, которые хотим установить. Если на данном этапе у вас нет уверенности в выборе конкретных компонентов, то добавление и удаление можно будет сделать позже, после установки программы:


Шаг №6: Принимаем лицензионное соглашение:


И нажимаем на кнопку "Установить" :


Для завершения установки нажимаем "Завершить" . После завершения установки Qt Creator запустится самостоятельно (для этого необходимо поставить галочку возле пункта "Launch Qt Creator" ):


Вот примерно следующее вы должны увидеть при запуске Qt Creator:


Поздравляем! Qt Creator установлен.

Установка Qt Creator через командную строку в Linux

Еще одним альтернативным и простым способом установки Qt Creator в Linux на основе Debian является установка из пакетов. Если при работе с Linux вы используете терминал, то перед скачиванием и установкой Qt Creator программа запросит пароль пользователя root (команда sudo без дополнительных опций). Только после этого начнется скачивание и извлечение файлов. Обычно, пакеты Linux не содержат последней версии Qt и их необходимо обновить. Ниже приведен алгоритм действий, позволяющий за 4 шага установить Qt Creator через терминал в Linux.

Шаг №1: Обновление набора утилит для установки, удаления, обновления, поиска пакетов в Linux.

$ sudo apt update

Шаг №2: Скачивание и установка Qt.

$ sudo apt install qt5-default

Шаг №3: Установка Qt Creator.

$ sudo apt install qtcreator

Шаг №4: Установка тестовых программ.

$ sudo apt install qtbase5-examples qtdeclarative5-examples

Установка Qt Creator в Windows

Сначала нам нужно скачать установочный пакет Qt. Вы можете это сделать, обратившись к оф. сайту qt.io. Либо же воспользоваться альтернативным вариантом и скачать с какого-нибудь «зеркала» (например, c этого, полный список всех «зеркал» находится здесь):


Нажимаем на official_releases/ и переходим к online_installers/ :


Нажимаем на online_installers/ и скачиваем файл qt-unified-windows-x86-online.exe :


Запустив скачанный файл, видим перед собой приветствие «Qt Online Installer». Нажимаем "Next" :


Далее у нас спросят о наличии Qt Account. Можно смело нажимать "Skip" и двигаться дальше:


Затем снова "Далее" :


Теперь нам нужно указать путь установки Qt. Для простоты я выбрал C:\Qt :


На следующем шаге нам нужно выбрать набор компиляторов, которыми мы будем пользоваться на данных уроках. Я предлагаю ограничиться выбором пакета MinGW 7.3.0 32-bit , а остальные метки поставить так, как указано на скриншоте ниже:


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

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

Вначале нам необходимо создать проект. Сразу скажу, что наша программа будет консольным приложением. Для этого выберите "Файл" > "Создать файл или проект…" или можно воспользоваться сочетанием клавиш Ctrl+N :


Перед вами появится «Мастер настройки проектов». В левой колонке отметьте пункт "Приложение" , а затем в правой — "Консольное приложение Qt" :


На следующем шаге нужно будет указать имя для нашей будущей программы и папку, где будут располагаться файлы проекта. У меня это My_QtApplication и C:\dev\Qt_Project соответственно:


На следующем шаге без изменений, поэтому просто нажимаем кнопку "Далее" :


Теперь нам нужно выбрать набор компиляторов, который мы будем использовать для сборки нашего проекта. Я настоятельно рекомендую выбрать Desktop Qt 5.13.0 MinGW 32-bit (сняв при этом отметки с остальных, если они у вас есть):


На последнем шаге нажимаем "Завершить" :


Теперь вы можете увидеть автоматически сгенерированный Qt-проект консольного приложения. Давайте рассмотрим его детально:

Есть консольное приложение на Qt, которое запускает несколько потоков. Фактически в main я создаю классы потоков. Вопрос, где и как мне запустить деструкторы этих классов, когда я закрою окно консоли? Не могу сообразить.

Пробовал так в main:

Корректное завершение
Когда закрываю окно QGraphicsView`а, процесс остается еще запущен и пишет еще что возникла ошибка.


Корректное завершение QCoreApplication
Добрый день! OC: Windows 7 Professional Qt: 5.7.0 Есть приложение QCoreApplication: int.

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

Ошибка консольного приложения
Что это? Скриншот в вложении.

потом где-нибудь пошлете сигнал, удалите класс через делет и словите неожиданности

это бесконечный цикл, пока внутри него есть хотя ба один QObject. То есть выйти из него и удалить классы - никак, без изврата


у потока есть сигнал завершении работы, его и нужно ловить, пирмерно так

Drus, Попробовал так. окно закрывается, а сигнала finished() нет.
Наличие потока проверил, запускается нормально. странно.

Добавлено через 9 минут
Drus, Заметил еще такую вещь. У меня в одном из потоков в run() есть бесконечный цикл. Если цикл убрать то finished вызывается после окончания run, а если окно закрыть то нифига.
Можно как то еще отловить закрытие окна консольного приложения или просто его завершение?

Добавлено через 29 минут
Нашел вроде бы вариант, связать в main:

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

Простите что так долго не отвечал.

касательно вопроса вашего - я не подскажу так навскидку. слотосвязывание производите до того как в run отправляете? это важно.

Репутация: 48
Всего: 135

Здравствуйте.
Есть простенькое консольное приложение на Qt.

Подскажите, как правильно выйти из такого приложения ? Если в Windows нажать Ctrl+C или Ctrl+Break, то программа закрывается, но деструктор

Some() не вызывается. Как вообще в таком приложении отслеживать нажатия клавиш ? Допустим, я хочу, чтобы программа нормально завершалась по Esc
Желательно кроссплатформенное решение. Если же решение только системозависимое, то подскажите, пожалуйста, как это сделать в Windows и в Linux.
Спасибо.

Женщины отличаются от программистов тем, что у них чары состоят из стрингов

Репутация: 24
Всего: 196

кроссплатформенного решения нет. для LINUX ты должен через termios настроить получение данных терминала без ожидания сброса буферов, а под windows нужно использовать их API Console*.

Репутация: 48
Всего: 135

bsa, спасибо.
С Ctrl+C справился. POSIX-сигналы, оказывается, в венде прекрасно работают

В Linux не проверял, но, думаю, там всё будет работать.
Сейчас поищу как обрабатывать клавиши
Женщины отличаются от программистов тем, что у них чары состоят из стрингов

Репутация: 24
Всего: 196

borisbn, вообще-то, делать так, как ты сделал не рекомендуется. Обработчики сигналов должны выполнять минимум операций и, желательно, над атомарными типами без блокировок. В противном случае, программа может повиснуть.

Репутация: 48
Всего: 135

Женщины отличаются от программистов тем, что у них чары состоят из стрингов

Репутация: 24
Всего: 196

borisbn, х.з. все классы qt потокобезопасные. поэтому есть вероятность наличия мьютекса.
Используй sig_atomic_t в качестве флага. А из программы его периодически проверяй.

Репутация: 48
Всего: 135

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

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

[ Время генерации скрипта: 0.1115 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Может быть я просто туплю, но всё же.

В конструкторе главного окна пишу первой строчкой:

Ноль реакции. Почему не завершается работа приложения ? Появляется главное окно программы.

Как завершить работу приложения ?

QT 4, студия 2008.

ты походу в начале вызываешь qApp->exit(), а уже потом exec( ) в функции маин. Если нет, то давай более подробно код.



Я, конечно, теперь всё это понимаю и могу просто до вызова a.exec() в функции main() сделать

Так что тут только кривизна разработчиков QT. И только. Если экземпляр класса создан, то все его функции должны работать нормально вне зависимости от обстоятельств и доп. условий.

Добавлено 14.03.09, 11:22
доп. пример к логике моих рассуждений:

Вот ты сел в автомобиль, закрыл дверь, и тут вспомнил, что забыл что-то и хочешь выйти. А на попытку выйти тебе бортовой компьютер отвечает: "Извините, машина не заведена, Вы не можете выйти из машины". Тебе такая логика понравится ?

Вот ты сел в автомобиль, закрыл дверь, и тут вспомнил, что забыл что-то и хочешь выйти. А на попытку выйти тебе бортовой компьютер отвечает: "Извините, машина не заведена, Вы не можете выйти из машины". Тебе такая логика понравится ?



Так что тут только кривизна разработчиков QT. И только.
Если хочешь сделать feature request, тебе сюда.
Но вообще, я себе не представляю, как в C++ можно реализовать подобное(выход из программы в обход main()). Либо ты юзаешь std::exit(), но тогда забудь о RAII, либо кидай исключение, но тогда тоже мало что хорошего выйдет, если его в main() не поймать. Как ты себе такое представляешь?

Абсолютно не согласен.

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

Если у меня есть непосредственный доступ к экземпляру класса QApplication, то он должен корректно выполнять ВСЕ предоставляемые функции, в том числе и функцию "сдохнуть".

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

Если у меня есть непосредственный доступ к экземпляру класса QApplication, то он должен корректно выполнять ВСЕ предоставляемые функции, в том числе и функцию "сдохнуть".

Читайте также: