Как сделать консольное приложение qt

Добавил пользователь Валентин П.
Обновлено: 10.09.2024

Оригинал: Developing Apps on Qt, Part 2
Автор: Manoj Kumar
Дата публикации: 29 февраля 2012
Перевод: А.Панин
Дата публикации перевода: 6 ноября 2012 г.

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

Давайте начнем с простейшего класса для работы с данными, т.е. с Qchar , который работает с 16-битными символами Unicode, представленными 16-битными беззнаковыми целыми значениями. В C существует тип "char" для работы с однобайтовыми значениями, для которых существует ограничение в 255 различных символов, поэтому при значениях размером в 16 бит возможно использование большего количества различных символов.

Некоторыми важными функциями этого класса являются: isdigit() , isLetter() , isLower() , isUpper() , isSymbol() , toLower() , toUpper() , и.т.д. Для использования этого класса необходимо подключить заголовочный файл QtCore . Давайте рассмотрим пример.

На основе описания из предыдущей статьи серии, создайте новый проект в Qt Creator. Я выбрал Консольное приложение Qt (Qt Console Application) из списка возможных типов проекта, поскольку не планирую использовать элементы графического интерфейса. Сохраните следующий код в файле main.cpp :

Нажмите Ctrl+r для сборки и запуска проекта. Во всплывающем окне можно будет увидеть следующий вывод программы:

Для того, чтобы разобраться в работе более 20 функций класса QChar , разработайте аналогичные небольшие программы и протестируйте эти функции по очереди.

Следующим важным классом является QString . В большинстве случаев при работе над проектом приходится сталкиваться с необходимостью обработки строк. В составе Qt есть очень полезный класс под названием QString (строки состоят из символов Unicode), базовым элементом которого являются объекты QChar .

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

В вышеприведенном коде мы использовали статическую функцию compare класса QString , третьим аргументом которой является энумератор Qt::CaseInsensitive . Важной вещью, о которой необходимо помнить, является различие между строкой со значением NULL и пустой строкой. Посмотрите на следующие объявления:

В первом случае объект str1 создан при помощи стандартного конструктора и строка является одновременно и пустой строкой и строкой со значением NULL. Строка со значением NULL создается при создании экземпляра класса QString при помощи стандартного конструктора. Во втором случае при создании объекта мы передали строку инициализации ("") , поэтому Qt будет рассматривать объект как пустую строку, а не строку со значением NULL.

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

После рассмотрения классов для работы с базовыми типами данных, давайте рассмотрим контейнерные классы. Начнем с того, что в нашем распоряжении есть QList , являющийся универсальным контейнерным классом. Задавайте тип хранимых при помощи QList данных в следующей обобщенной форме:

Можете использовать int, QString, Qdate, и.т.д. вместо "type". Давайте рассмотрим следующий код в качестве примера:

В коде выше мы использовали оператор для добавления элементов в список mylist . Функции класса позволяют нам добавлять элементы в начало и в конец списка. Для доступа к элементам списка мы использовали порядковый номер элемента, передавая его в качестве аргумента функции at(index) . Для удаления элементов с начала списка мы использовали функцию takeFirst(); а для удаления элементов с конца списка мы использовали takeLast() .

Класс итератора

Вместо доступа к элементам списка по порядковому номеру, мы можем использовать итераторы. Класс итератора в Qt носит название QListIterator . Давайте заменим цикл for в коде выше на следующий код:

Здесь мы создаем объект QListIterator для перечисления элементов списка, хранящего объекты QString . Мы передаем объект mylist типа QList конструктору класса QListIterator . Это позволяет установить итератор на первый элемент списка mylist . В цикле while происходит получение и вывод значений элементов до того момента, как итератор достигает конца списка.

Класс QList также предоставляет возможность использовать итераторы, основанные на стандартной библиотеке шаблонов (Standard Template Library). Если судить по скорости работы, они быстрее (незначительно), чем метод, описанный выше. А вот и пример кода:

Если вас заинтересовала эта тема, вы можете найти больше подробностей об итераторах в документации Qt.

Двигаемся дальше. Важный класс, являющийся потомком QList , позволяет работать с объектами типа QString надлежащим образом. Класс QStringList является вариантом реализации QList . Я использую этот класс в тех случаях, когда хочу разделить строку на подстроки. Давайте рассмотрим пример исходного кода:

Мы создали объект типа QStringList , затем разделили строку str на составляющие на основании наличия пробелов и присвоили результирующее значение переменной mylist типа QStringList . После этого мы можем использовать порядковые номера или итераторы для доступа к элементам списка.

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

Пары ключ-значение

Если вы хотите хранить элементы в виде пар ключ-значение, у вас есть два варианта классов: QMap и QHash . С точки зрения программиста, классы используются аналогично, тем не менее, они отличаются тем, как хранят данные. Еще раз, давайте рассмотрим различия на примере исходного кода:

Давайте проанализируем код. Сначала мы создали объект QMap и задали в качестве типов данных пары ключ-значение QString и int соответственно. После этого мы добавили несколько ключей и значений для хранения. Для доступа к элементам мы можем использовать итератор QMapIterator , который прост в использовании, и, на мой взгляд, не нуждается в описании. Поиск элементов осуществляется при помощи функции contains() , которая возвращает true в том случае, если существует элемент с заданным ключом.

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

Динамические массивы

Последней темой, которую я хотел бы обсудить в данной статье, являются динамические массивы. В Qt присутствует контейнерный класс, называемый QVector , который используется для хранения элементов в смежных областях памяти, как и в C ( int arr[10] ). Он позволяет осуществлять доступ к элементам на основе индексов. Пример того, как этот класс может быть использован:

В коде выше мы создали объект QVector mVect . Изначально размер массива равен нулю; в случае необходимости, мы можем передать начальный размер конструктору. Нет никаких отличий от QList в плане добавления элементов и доступа к ним. Одной из важных функций, использованной нами, является qSort , позволяющая отсортировать элементы массива. Ниже представлен вывод программы:

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

В следующей статье мы рассмотрим механизм сигналов и слотов в фреймворке Qt. А до этого времени продолжайте экспериментировать самостоятельно!

Частенько нужно написать GUI к уже готовой программе имеющей консольный интерфейс.
В Qt эта задача существенно упрощена. Нам понадобится всего несколько строк кода для вывода результат работы программы в форму.
Итак. Сначала создадим какой нибудь "hello world" и откомпилируем его:

Я использую linux, так что откомпилировал так:

Если у вас Windows создайте проект в студии и запаситесь бинарником prog.exe.

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

В функции main нашего приложения создадим идентификатор приложения и объект QProcess:

Запускаем нашу консольную утилиту:

Обратите внимание, что Windows пользователи должны указать приложение примерно так (точно не скажу.. давно это было):

Создаём поле в которое будет выведен результат:

Ждём пока процесс не завершится:

Показываем поле и ждём действий пользователя:


Можете попробовать также вывести информацию о каталоге при помощи команды dir (есть она по моему во всех ОС)

Ubuntu 10.04, QtCreator 32 bit Делаю консольное приложение, ставлю галочку Проект> Настройки запуска-> подробнее-> Запускать в терминале Терминал запускаеться, но программа не выполняеться, в чем проблема?


губит людей не пиво, губит людей Qt

а как ты определил, что программа не выполняется? может она просто ничего не делает?

>Консольное приложение в QT


Отучает от велосипедостроительства. Qt != GUI.

Всё, что есть в qt кроме гуя - велосипеды.


А если приложение ориентировано не только под Linux?

Писать кроссплатформенно можно и без кутей, ваш К.О.

using namespace std; int main(int argc, char *argv[]) < QCoreApplication a(argc, argv);


Честно, я теряюсь как обойтись при необходимости писать кроссплатформенно без Qt, когда речь заходит о поддержке сети и различных БД, и необходимостью преобразования изображений (размеры, формат, фильтры). Это то, с чем лично мне приходилось сталкиваться.

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

Народ, тут не стоит вопрос что лучше и за чем это надо) Просто помогите с проблемой)


УМВР. Покажи полностью main.cpp и .pro.


надо добавить ещё return a.exec();


>необходимостью преобразования изображений (размеры, формат, фильтры)

Для этого есть ImageMagick.



а где оно сейчас появляется?

Ему нужно в qt-creator.

Или же cerr ? ( 16.07.10 01:12:10 )


Подозреваю, вы просто забыли добавить в pro-файл:

Которая в свою очередь отвечает за флаг линковки: /SYBSYSTEM:CONSOLE. В итоге программа выодняется, просто этого не видно в терминале.

В отличии от Линукса, где консоль перехватывает вывод в stdout, в Windows для этого нужен бубен на этапе сборки.

Забирай желчь и метан и отправляйся на винфак.


Использовать один большой, качественный, кроссплатформенный велосипед лучше и надежнее, чем кучу мелких.



именно из-за таких фанатиков как ты гном катится в УГ

Тоже, не чего в терминале не выводиться

cout ( 16.07.10 11:54:03 )

Тоже самое будет, endl, тут не зачем

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


> Всё, что есть в qt кроме гуя - велосипеды.

В отличии от камы - на них ездить приятно

Я минимально изменил код тс, так что не пукай.


Мы говорим про кросс-платформенность. unix-way в современных реалиях (начичие таких ОС как Windows) тут не прокатывает.

попробуй без дизайнера сделать.

> Я минимально изменил код тс, так что не пукай.

Мимо, я не про тебя.

Ну так и смотри кому отвечаешь.

Предлагаешь пользователю поставить кроме своего велосипеда ещё добрый десяток библиотек вроде ImageMagick?

Появляеться и все. Не чего не происходит


А если запустить самостоятельно из cmd, предравительно скопировав в директорию с exe-файлом QtCore.dll? И да, покажите pro-файл и исходники, всяко быстрее подсказать будет.

У него уже Ubuntu 10.04, причем тут cmd, exe?

Как уже сказали, было бы неплохо, если бы ты скинул архив с исходниками, например, на rghost.


Честно, я теряюсь как обойтись при необходимости писать кроссплатформенно без Qt,

когда речь заходит о поддержке сети

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

и необходимостью преобразования изображений (размеры, формат, фильтры).

lib* (-jpeg, -png, etc) - тысячи их :)


Использовать один большой, качественный, кроссплатформенный велосипед лучше и надежнее, чем кучу мелких.

1 велосипед общего назначения будет работать хуже чем 10 узкоспециализированных

Запустите в Меню > Разработка > Qt Creator. Нажмите на кнопку “Новый проект” (Рис. 1). В следующем окне необходимо выбрать тип создаваемого проекта: Приложение Qt-Widgets > Выбрать (Рис. 2). В следующем окне введите название проекта не содержащего русские буквы, например, mypro1 (Рис. 3). Здесь же необходимо определить, где будет находиться проект. В корне домашней директории создайте папку проектов, например, QT_Project.


Рис. 1. Стартовое окно Qt Creator


Рис. 2. Выбор типа проекта


Рис. 3. Окно выбора размещения проекта

На следующем этапе создается комплект. Комплект определяет средства сборки программ: компилятор, отладчик, утилиты. Нажмите ссылку “Добавить комплект в настройках”. В появившемся окне нажмите кнопку “Добавить”.
Введите название комплекта, например, Desktop. Определите значения полей как показано на Рис. 4. Те поля, которые определились автоматически, оставьте без изменений. В качестве корня образа укажите папку проектов.


Рис. 4. Параметры комплекта

Нажмите ОК и Далее. В следующем окне необходимо определиться с названием класса и выбрать базовый класс (можно всё оставить как есть, по умолчанию).


Рис. 5. Окно выбора базового класса

В следующем окне (Рис. 6) можно добавить контроль версий и увидеть какие файлы будут добавлены в проект:


Рис. 6. Итоговое окно создания проекта

Нажмите на кнопку “Завершить” и вы перейдете к редактору кода. В боковой панели “Проекты” разверните “Формы” и кликните на mainwindow.ui.


Рис. 7. Окно редактора форм

Вы перейдете к редактору форм. (Рис. 7). Найдите в боковой панели (слева) секцию “Display Widgets”. В этой секции захватите ЛКМ элемент Label (метка) и перетащите её на форму.

Кликните на тексте и измените его содержание на “Здравствуй, мир!”. В правой боковой панели “Инспектор объектов” (в нижней части, при выделенном объекте label ) найдите свойство font и измените его значение: размер шрифта, гарнитуру, по вашему усмотрению. Вы можете свободно изменять размер ограничивающего прямоугольника label захватив ПКМ за края прямоугольника. Но если нужна компактность, то размер всегда можно подогнать: ПКМ над label вызовите контекстное меню > Компоновка > Подогнать размер.

Обратите внимание, что окно будет оформлено в системные цвета. Если вы используете KDE (а эта среда основана на Qt), то будет использована текущая палитра Plasma, которая наследуется виджетами Qt.

В левой боковой панели (внизу) нажмите кнопку Собрать проект (или Ctrl+B), а затем Запустить проект (или Ctrl+R). Появится окно вашего первого приложения:


Применение таблицы стилей для элементов

Для изменения внешнего вида элементов можно использовать таблицу стилей. Изменить (или создать) таблицу стилей можно в свойстве styleSheet . Найдите это свойство в инспекторе объектов. Или выполните: над label ЛКМ > Изменить StyleSheet (таблицу стилей). В окне Правка стилей > Добавить шрифт. Выберите какой-нибудь декоративный шрифт установленный в вашей системе. В окне мини-редактора появится правило каскадной таблицы стилей. Добавьте цвет текста:

Шрифт Decor может отсутствовать в вашей системе выбирайте из доступных шрифтов в списке окна “Выбор шрифта”: шрифт.


Теперь кликните на самой форме, вне границ label . Тем самым вы перейдете к изменению значений свойств MainWindow. Измените свойство windowTitle . Это заголовок окна. Измените свойство styleSheet . В редакторе стилей введите:

Или нажмите на кнопку Добавить цвет > background-color и определите цвет фона для окна. Возможный результат на Рис. 10:


Задания для самостоятельной работы

Оцените материал
(3 оценок, среднее: 5,00 из 5)
Загрузка.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

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