Qt описание на русском. Первое оконное приложение на Qt

С каждым годом становится все больше операционных систем, и потому разработчикам все труднее удовлетворять потребности пользователей. Три самые популярные компьютерные платформы - Windows, Linux и Mac OS, а также три мобильные - Android, iOS и Windows Mobile - продолжают активно бороться между собой. А это значит, что качественное приложение должно работать на всех основных платформах.

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

Что такое Qt Creator

Qt Creator (не так давно имевший название Greenhouse) - это одна из самых распространенных кроссплатформенных IDE. Ее плюсы - удобство, быстрота работы, а также - свободность, так как это ПО с открытым исходным кодом. Поддерживаются такие языки, как C, С++, QML.

Программа была написана компанией под названием Trolltech, которая в полной мере выполнила цель создания среды - работу с графическим фреймворком Qt. Удобный графический интерфейс с поддержкой Qt Widgets и QML, а также большое число поддерживаемых компиляторов позволяют быстро и удобно создать свое кроссплатформенное приложение.

Главная задача этой IDE - обеспечить наиболее быструю кроссплатформенную разработку, используя собственный фреймворк. Благодаря этому разработчики получают прекрасную возможность не писать приложения нативно (т. е. отдельно под каждую платформу), а создать общий код, и, возможно, подогнать его под особенности используемых ОС.

Qt Creator также включает в себя утилиту Qt Designer, что позволяет обработать внешний вид окна приложения, добавляя и перетаскивая элементы (аналогично Windows Forms в Visual Studio). В качестве систем сборки используются qmake, cmake и autotools.

Установка Qt Creator

Итак, пора рассмотреть как установить Qt Creator. Если для Windows разработчики позаботились и сделали оффлайн-установщик, то в Linux 32-bit этой возможности не предусмотрено. Поэтому во время установки вам может потребоваться стабильное интернет-соединение (~20-30 минут). Для начала скачаем установщик:

  • Скачать Qt Creator для Linux 32-bit (нажимаем "View other options" ).
  • Скачать Qt Creator для Linux 64-bit.

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

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

Запускаем программу.

Теперь нажимаем "Next" .

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

Нажимаем "Next" .

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

В этом меню находится выбор компонентов. К примеру, можно выбрать установку инструментов для разработки на Android, или же исходных компонентов (это нужно для статической сборки, если кому-то это нужно - напишите в комментариях, и я напишу отдельную статью). Если Вы не уверены, нужны Вам эти компоненты или нет, оставьте их пока так - даже после установки Qt будет возможным удаление и добавление элементов.

В этом окне принимаем лицензию. Жмем "Next" .

Если Вы готовы, начинайте установку. У Вас запросят пароль суперпользователя (sudo), после чего начнется скачивание и извлечение файлов. Альтернативный способ - установка через терминал. Для начала необходимо обновить список пакетов.

Скачиваем и устанавливаем Qt:

sudo apt install qt5-default

Теперь установка Qt Creator:

sudo apt install qtcreator

И, если нужно, исходники.

sudo apt install qtbase5-examples qtdeclarative5-examples

Настройка Qt Creator

После окончания установки перезагрузите компьютер и запустите Qt Creator. Перейдите в меню "Инструменты" -> "Параметры" .

Здесь следует рассмотреть несколько вкладок.

1. Среда - это настройка внешнего вида самой IDE, а также изменение сочетаний клавиш и управление внешними утилитами.

2. Текстовый редактор - здесь идет настройка внешнего вида, шрифтов и расцветки редактора.

3. C++ - подсветка синтаксиса, работа с расширениями файлов и UI (т. е. формами).

4. Android - здесь собраны пути к необходимым инструментам, а также в этом меню настраиваются подключаемые или виртуальные устройства.

Установка компонентов Qt Creator

Если вдруг так случилось, что Вы забыли установить какой-то компонент, или, наоборот, хотите его удалить, то на помощь придет Qt Maintenance Tool. Это инструмент, позволяющий управлять всеми компонентами Qt Creator.

Чтобы запустить его, перейдите в меню приложений, выберите пункт "Разработка" -> "Qt Maintenance Tool" .

Выберите необходимый пункт (Удалить/добавить компоненты, обновить компоненты или удалить Qt). После выполните необходимые операции и закройте окно.

Работа с Qt Creator - первый проект

Ну что же, час пробил! Установка Qt Creator завершена. Пора сделать свое первое кроссплатформенное приложение на Linux, а затем скомпилировать его на Windows. Пусть это будет... программа, выводящая иконку Qt, кнопку и надпись, на которую по нажатию кнопки будет выводиться случайная фраза. Проект несложный, и, конечно же, кроссплатформенный!

Для начала откроем среду разработки. Нажмем "Файл" -> "Создать файл или проект..." . Выберем приложение Qt Widgets - его быстро и удобно сделать. А название ему - "Cross-Platphorm" . Вот как!

Комплект - по умолчанию. Главное окно тоже оставляем без изменений. Создаем проект.

Для начала необходимо настроить форму - главное окно приложения. По умолчанию оно пустое, но это не останется надолго.

Перейдем в папку "Формы" -> "mainwindow.ui" . Откроется окно Qt Designer:

Удаляем панель меню и панель инструментов на форму, нажав правой кнопкой мыши и выбрав соответствующий пункт. Теперь перетаскиваем элементы Graphics View, Push Button и Label таким образом:

Чтобы изменить текст, дважды кликните по элементу. В свойствах Label (справа) выбираем расположение текста по вертикали и по горизонтали - вертикальное.

Теперь пора разобраться с выводом иконки. Перейдем в редактор, слева кликнем по любой папке правой кнопкой мыши и выберем "Добавить новый..." . Теперь нажимаем "Qt" -> "Qt Resource File" . Имя - res. В открывшемся окне нажимаем "Добавить" -> "Добавить префикс" , а после добавления - "Добавить файлы" . Выбираем файл, а в появившемся окне "Неверное размещение файла" кликаем "Копировать" .

Получилось! Сохраняем все. Снова открываем форму. Кликаем правой кнопкой мыши по Graphics View, выбираем "styleSheet..." -> "Добавить ресурс" -> "background-image" . В левой части появившегося окна выбираем prefix1, а в правой - нашу картинку. Нажимаем "ОК" . Настраиваем длину и ширину.

Все! Теперь можно приступать к коду. Клик правой кнопкой мыши по кнопке открывает контекстное меню, теперь надо нажать "Перейти к слоту..." -> "clicked()" . В окне набираем следующий код:

Или вы можете скачать полный проект на GitHub . Работа с Qt Creator завершена, нажимаем на значок зеленой стрелки слева, и ждем запуска программы (если стрелка серая, сначала нажмите на значок молотка). Запустилось! Ура!

Рис. A.1.

После перезагрузки ОС Windows для обращения к компилятору достаточно будет указывать его имя - g++ .

Таким образом, в ОС Linux для работы с компилятором в командной строке необходимо запустить Терминал, а в ОС Windows – командную строку. После чего работа с компилятором g++ с ОС Windows и Linux идентична.

Рассмотрим опции компилятора командной строки, необходимые для компиляции и запуска простейших программ.

Для того, чтобы создать исполняемый файл из текста программы на C++ , необходимо выполнить команду

Здесь name.cpp - имя файла с текстом программы. В результате будет создан исполняемый файл со стандартным именем a.out. Для того, чтобы создать исполняемый файл с другим именем, необходимо выполнить команду

g++ -o nameout name.cpp

Здесь name.cpp - имя файла с текстом программы, nameout - имя исполняемого файла.

При использовании компилятора g++ после компиляции программы автоматически происходит компоновка программы (запуск компоновщика make). Чтобы исключить автоматическую компоновку программы, следует использовать опцию -c. В этом случае команда будет иметь вид g++ -c name.cpp

Рис. A.2.

Рис. A.3.

Технология работы с компилятором g++ может быть такой: набираем текст программы в стандартном текстовом редакторе, потом в консоли запускаем компилятор, после исправления синтаксических ошибок запускаем исполняемый файл. После каждого изменения текста программы надо сохранить изменения в файле на диске, запустить компилятор, и только после этого запускать программу (исполняемый файл). Очень важно не забывать сохранять текст программы, иначе при запуске компилятора будет компилироваться старая версия текста программы.

Рис. A.4.

Рис. A.5.

Компилятор g++ эффективен при разработке больших комплексов программ, он позволяет собирать приложения из нескольких файлов, создавать библиотеки программ. Рассмотрим процесс создания и использования библиотеки решения задач линейной алгебры (см. п. 6.4, задачи 6.10 - 6.12):

int SLAU(double **matrica_a, int n, double *massiv_b, double *x) - функция решения системы линейных алгебраических уравнений;

int INVERSE(double **a, int n, double **y) - функция вычисления обратной матрицы;

double determinant(double **matrica_a, int n) - функция вычисления определителя.

Для создания библиотеки создадим заголовочный файл slau.h и файл slau.cpp , в который поместим тексты всех трёх функций решения задач линейной алгебры.

Текст файла slau1.h:

int SLAU(double ** matrica_a, int n, double *massiv_b, double *x); int INVERSE(double **a, int n, double **y); double determinant (double ** matrica_a, int n);

Текст файла slau1.cpp :

#include int SLAU(double ** matrica_a, int n, double *massiv_b, double *x) { int i, j, k, r; double c,M, max, s; double **a, *b; a=new double * [ n ]; for (i =0; imax) { max=fabs (a [ i ] [ k ]); r= i; } for (j =0; j=0; i --) { for (s =0, j= i +1; jmax) { max=fabs (a [ i ] [ k ]); r= i; } if (r !=k) det=_det; for (j =0; j

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

#include #include //Подключение личной библиотеки slau #include " slau1 .h " using namespace std; int main () { int result, i, j,N; double **a, *b, *x; //Ввод размерности системы. cout<<" N = "; cin>>N; //Выделение памяти для матрицы правых частей и вектора свободных членов. a=new double * ; for (i =0; i>a [ i ] [ j ]; cout<<" Input massiv B "<>b [ i ]; //Вызов функции решения СЛАУ методом Гаусса из библиотеки slau.h result=SLAU(a,N, b, x); if (result ==0) { //Вывод массива решения. cout<<" MassivX "<

Теперь необходимо из этих текстов создать работающее приложение. Рассмотрим это поэтапно.

  1. Компиляция библиотеки slau1.h с помощью команды g++ -c slau1.cpp .
  2. Компиляция главной функции main.cpp с помощью команды g++ -c main.cpp .
  3. Создание исполняемого файла с именем primer из двух откомпилированных файлов main.o и slau1.o с помощью команды g++ main.o slau1.o -o primer .
  4. Запуск исполняемого файла.

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

При разработке программ с большим количеством вычислений, компилятор g++ позволяет оптимизировать программы по быстродействию. Для получения оптимизированных программ можно использовать ключи -O0, -O1, -O2, -O3, -Os :

  • при использовании ключа -O0 оптимизация отключена, достигается максимальная скорость компиляции, опция задействована по умолчанию;
  • при использовании ключа "мягкой" оптимизации -O1 происходит некоторое увеличение времени компиляции, этот ключ оптимизации позволяет одновременно уменьшать занимаемую программой память и уменьшить время выполнения программы;
  • при использовании ключа -02 происходит существенное уменьшение времени работы программы, при этом не происходит увеличение памяти, занимаемой программой, не происходит развёртка циклов и автоматическое встраивание функций;
  • ключ "агрессивной" оптимизации -O3 нацелен в первую очередь на уменьшение времени выполнения программы, при этом может произойти увеличение объёма кода и времени компиляции, в этом случае происходит развёртка циклов и автоматическое встраивание функций;
  • ключ -Os ориентирован на оптимизацию размера программы, включаются те опции из набора -O2 , которые обычно не увеличивают объём кода, применяются некоторые другие оптимизации, направленные на снижение его объёма.

Для разработки программ на различных языках программирования можно использовать текстовый редактор Geany . Редактор Geany входит в репозитории большинства дистрибутивов Linux, его установка осуществляется стандартным для вашего дистрибутива образом (в debian-подобных ОС с помощью команды apt-get install geany ). Для установки его в Windows необходимо скачать со страницы http://www.geany.org/Download/Releases инсталляционный файл и установить программу стандартным способом.

Разработка программ с использованием Geany более эффективна. Окно Geany представлено на .

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

  • Необходимо создать шаблон приложения на C/C++ (или другом языке программирования) с помощью команды Файл -> Создать из шаблона -> main.cxx. После чего необходимо ввести текст программы и сохранить его.
  • Для компиляции и запуска программы на выполнение служит пункт меню Сборка. Для компиляции программы следует использовать команду Сборка -> Скомпилировать (F8 ). В этом случае будет построен объектный код программы (файл с расширением .o или .obj ). Для создания исполняемого кода программы служит команда Сборка -> Собрать (Shift+F9 ). Для запуска программы следует выполнить команду Сборка -> Выполнить (F5).

Параметры компилятора определяются автоматически после выбора шаблона (Файл -> Создать из шаблона). Однако команды компиляции и сборки по умолчанию можно изменить, используя команду Сборка -> Установить параметры сборки (см. ). Здесь %f - имя компилируемого файла, %e - имя файла без расширения.

Рис. A.6.

Рис. B.1.

Задача B.2. Построить графики функций и в одной графической области.

#include #include int sample (mglGraph _ gr) { gr->Title ("Графики функции y = f (x) "); //Заголовок графика gr->SetRanges (-15,15, -2,2); //Границы по осям gr->Axis (); //Вывод значений возле осей gr->Grid (); //Линии сетки gr->Fplot (" sin (2 * x) ", " r "); //График функции f(x), красная (r) сплошная линия. gr->AddLegend (" sin (2 * x) ", " r "); //Добавление легенды gr->Fplot (" 4* cos (x) /3 ", " k."); //График функции y(x), чёрная (k) линия и точки (.). gr->AddLegend (" 4* cos (x) /3 ", " k."); //Добавление легенды gr->Legend (3); //Вывод легенды на экран в правом верхнем углу gr->Label (" x ", " OX ", 0); //Вывод подписи по оси абсцисс gr->Label (" y ", " OY "); //Вывод подписи по оси ординат return 0; } int main (int arg c, char ** argv) { set locale (LC_CTYPE, " ru_RU.utf 8 "); mglQT gr (sample, " Plot "); return gr.Run (); }

Рис. B.2.

Задача B.3. Построить в одном графическом окне графики функций:

Результаты вывести на экран и в файл.

Рис. B.3.

#include #include #include using namespace std; int sample (mglGraph * gr) { //График функции sin(x) на интервале [-10; 10] gr->Subplot (2, 2, 0); gr->Title ("График функции sin (x) "); gr->setOrigin (0, 0); gr->SetRanges (-10,10, -1,1); gr->Axis (); gr->Grid (); gr->Fplot (" sin (x) ", " k -. "); //График функции cos(x) на интервале [-6; 6] gr->Subplot (2, 2, 1); gr->Title ("График функции cos (x) "); gr->setOrigin (0, 0); gr->SetRanges (-6,6, -1,1); gr->Axis (); gr->Grid (); gr->Fplot (" cos (x) ", " k."); //График функции exp(cos(x)) на интервале [-6; 6] gr->Subplot (2, 2, 2); gr->Title ("График функции e ^{ cos (x) } "); gr->setOrigin (0, 0); gr->SetRanges (-6, 6, 0, 3); gr->Axis (); gr->Grid (); gr->Fplot (" exp (cos (x)) ", " r o "); //График функции exp(sin(x)) на интервале gr->Subplot (2, 2, 3); gr->Title ("График функции e ^{ sin (x) } "); gr->setOrigin (0, 0); gr->SetRanges (-15, 15, 0, 3); gr->Axis (); gr->Grid (); gr->Fplot (" exp (sin (x)) ", " r - o "); return 0; } int main (int arg c, char __ argv) { //Вывод на экран или в файл int k; cout<<"Введите 1, если будете выводить на экран, 2 - если в файл\nk = "; cin>>k; if (k==1) { //Поддержка кириллицы в С++ set locale (LC_CTYPE, " ru_RU.utf 8 "); //Вывод на экран mglQT gr (sample, " Plot s "); return gr.Run (); } else { mglGraph gr; gr.Alpha (true); gr.Light (true); set locale (LC_CTYPE, " ru_RU.utf 8 "); //Обращение к функции вывода sample(& gr); //Запись изображения в файл gr.WriteEPS (" test.eps "); return 0; } }

Рис. B.4.

Задача B.4. Построить график функций .

Нетрудно заметить, что функция не существует в точке ноль. Поэтому построим её график на двух интервалах [-2;-0.1] и , исключив точку разрыва из диапазона построения. Текст программы с подробными комментариями приведён далее. Решение задачи представлено на .

#include #include using namespace std; int sample (mglGraph * gr) { mglData x1 (191), x2 (191), y1 (191), y2 (191); int i; float h, a1, b1, a2, b2; //График точечной разрывной функции //Первый интервал a1=-2;b1=-0.1; h = 0.01; for (i =0; i <191; i++) { x1 [ i ]= a1+ i *h; y1 [ i ]=1 -0.4/ x1 [ i ]+ 0.05 / x1 [ i ] / x1 [ i ]; } //Второй интервал a2 = 0.1; b2=2; h = 0.01; for (i =0; i <191; i++) { x2 [ i ]= a2+ i *h; y2 [ i ]=1 -0.4/ x2 [ i ]+ 0.05 / (x2 [ i ] * x2 [ i ]); } gr->SetRanges (a1, b2, 0, 10); //Границы по оси абсцисс и ординат gr->Axis (); //Оси координат gr->Grid (); //Сетка gr->Plot (x1, y1, " k "); //График функции на первом интервале, чёрный (k) цвет. gr->Plot (x2, y2, " k "); //График функции на втором интервале, чёрный (k) цвет. gr->set font size (2); //Размер шрифта gr->Title ("График разрывной функции"); //Заголовок gr->set font size (4); //Размер шрифта gr->Label (" x ", " OX ", 0); //Подпись по оси абсцисс gr->

Рис. B.5.

Задача B.5. Построить график функции на интервале [-5;5].

Функция имеет разрыв в точках -1 и 3. Построим её график на трёх интервалах [-5; -1.1], [-0.9;2.9] и , исключив точки разрыва из диапазона построения. Текст программы с подробными комментариями приведён далее. Решение задачи представлено на .

#include #include using namespace std; int sample (mglGraph * gr) { mglData x1 (391), x2 (381), x3 (191), y1 (391), y2 (381), y3 (191); int i; float h, a1, b1, a2, b2, a3, b3; //График точечной разрывной функции a1=-5;b1=-1.1; //Первый интервал h = 0.01; for (i =0; i <391; i++) { x1 [ i ]= a1+ i _h; y1 [ i ]=1/(x1 [ i ] * x1 [ i ]-2*x1 [ i ] -3); } a2=-0.9;b2 = 2.9; //Второй интервал h = 0.01; for (i =0; i <381; i++) { x2 [ i ]= a2+ i *h; y2 [ i ]=1/(x2 [ i ] *x2 [ i ]-2*x2 [ i ] -3); } a3 = 3.1; b3=5; //Третий интервал h = 0.01; for (i =0; i <191; i++) { x3 [ i ]= a3+ i *h; y3 [ i ]=1/(x3 [ i ] * x3 [ i ]-2*x3 [ i ] -3); } gr->SetRanges (-6,6, -3,3); //Границы по оси абсцисс и ординат gr->Axis (); //Оси координат gr->Grid (); //Сетка gr->Plot (x1, y1, " k "); //График функции на первом интервале, чёрный (k) цвет. gr->Plot (x2, y2, " k "); //График функции на втором интервале, чёрный (k) цвет. gr->Plot (x3, y3, " k "); //График функции на третьем интервале, чёрный (k) цвет. gr->set font size (2); //Размер шрифта gr->Title ("График функции c двумя разрывами"); //Заголовок gr->set font size (4); //Размер шрифта gr->Label (" x ", " OX ", 0); //Подпись по оси абсцисс gr->Label (" y ", " OY "); //Подпись по оси ординат return 0; } int main (int arg c, char ** argv) { set locale (LC_CTYPE, " ru_RU.utf 8 "); mglQT gr (sample, " Plot "); return gr.Run (); }

Рис. B.6.

Задача B.6 . Построить график функции .

График задан в параметрической форме и представляет собой эллипс. Выберем интервал построения графика , ранжируем переменную на этом интервале, сформируем массивы и и построим точечный график. Текст программы и результаты её работы () представлены далее.

#include #include #include using namespace std; int sample (mglGraph * gr) { //График эллипса int i, n; float h, a, b, t; a=0; b=2*M_PI; n=200; h=(b-a) /n; //Формирование массивов абсцисс и ординат mglData x (n), y (n); for (i =0; iSetRanges (-3,3, -2,2); //Границы по осям координат gr->Axis (); //Оси координат gr->Grid (); //Сетка gr->Plot (x, y, " k "); //График функции gr->set font size (2); gr->Title ("График эллипса"); gr->SetFontSsize (4); gr->Label (" x ", " OX ", 0); gr->Label (" y ", " OY "); return 0; } int main (int arg c, char ** argv) { set locale (LC_CTYPE, " ru_RU.utf 8 "); mglQT gr (sample, " Plot "); return gr.Run (); }

Рис. B.7.

Задача B.7. Построить график функции:

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

#include #include using namespace std; int sample (mglGraph * gr) { //Изображение поверхности gr->SetRanges (-5,5, -5,5, -1,2); //Диапазон изменения x, y, z. mglData z (500, 400); //Размер матрицы z по х и по y //Формирование матрицы z. z.Mod ify (" 0.6 * sin (2 * pi * x) * sin (3 * pi * y) + 0.4 * cos (3 * pi *(x * y)) "); gr->Rotate (40, 60); //Вращение осей gr->Box (); gr->Axis (); gr->Grid (); gr->Mesh (z); //График функции } int main (int arg c, char ** argv) { set locale (LC_CTYPE, " ru_RU.utf 8 "); mglQT gr (sample, " MathGL Example "); return gr.Run (); }

Рис. B.9. График к задаче B.8

В завершении приведём решение реальной инженерной задачи с использованием MathGL .

Задача B.9. В "Основах химии" Д. И. Менделеева приводятся данные о растворимости азотнокислого натрия в зависимости от температуры воды. Число условных частей , растворяющихся в 100 частях воды при соответствующих температурах, представлено в таблице.

В первой строке файла хранится количество экспериментальных точек, в следующих двух строках - массивы абсцисс и ординат экспериментальных точек. В четвёртой строке хранится количество (3) и точки (25, 32, 45), в которых необходимо вычислить ожидаемое значение.

Текст программы решения задачи с комментариями приведён ниже.

#include #include #include using namespace std; int sample (mglGraph * gr) { mglData x2 (70), y2 (70); int i, n, k; float h, a, b, sx =0, sy =0, syx =0, sx2 =0; ifstream f; //Поток для чтения файла исходных данных f.open (" input.txt "); F>>n; //Чтение исходных данных, n - количество экспериментальных точек. mglData x (n), y (n); //x(n),y(n) - координаты экспериментальных точек cout<<" X \n "; for (i =0; i>x [ i ]; cout<>y [ i ]; cout<>k; cout<<" k = "<>xr [ i ]; cout<SetRanges (x [ 0 ], 80, 70, 140); gr->set font size (3); gr->Axis (); //Оси координат gr->Grid (); //Сетка //Первая легенда gr->AddLegend ("Эксперимент", " b o "); gr->Plot (x, y, " b o "); //График экспериментальных точек, голубой (b) цвет. //Вторая легенда gr->AddLegend ("Расчёт", " r * "); gr->Plot (xr, yr, " r * "); //График ожидаемых значений. //Третья легенда gr->AddLegend ("Линия регрессии", " k - "); gr->Plot (x2, y2, " k - "); //Изображение линиии регрессии. gr->Title ("Задача Менделеева"); //Заголовок gr->Label (" x ", " t ", 0); //Подпись по оси абсцисс gr->Label (" y ", " NaNO_3 "); //Подпись по оси ординат gr->Legend (2); //Вывод легенды return 0; } int main (int arg c, char ** argv) { set locale (LC_CTYPE, " ru_RU.utf 8 "); mglQT gr (sample, " Plot "); return gr.Run (); }

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

X 0 4 10 15 21 29 36 51 68 Y 66.7 71 76.3 80.6 85.7 92.9 99.4 113.6 125.1 k=3 a=67.5078 b=0.87064 Xr Yr 25 89.2738 32 95.3683 45 106.687

Графическое решение задачи, полученное с помощью средств библиотеки MathGL , представлено на .

Рис. B.11.

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

0 4 10 15 21 29 36 51 68
66.7 71.0 76.3

В этом примере мы опишем шаги использования Qt Creator для написания маленькой программы Qt, Text Finder. Вдохновлённые примером QtUiTools Text Finder , мы напишем похожую на него но упрощённую версию как показано ниже.

Настройка вашей среды

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

  • На Windows и Linux: в меню Инструменты , в пункте Параметры .
  • В Mac OS X: в Инструменты , пункт Qt4 .

Замечание: Если для сборки Qt вы использовали Visual Studio, все переменные окружения, установленные в Visual Studio, должны быть также установлены для Qt Creator.

Настройка проекта

Мы начнём с проекта Gui приложение Qt4, сгенерированного Qt Creator. Документ Создание проекта в Qt Creator детально описывает этот проект. Не забудьте выбрать QWidget в качестве базового класса Text Finder. Если ваш проект ещё не загружен, вы можете загрузить его выбрав Открыть... из меню Файл .

В вашем проекте будут следующие файлы:

  • textfinder.h
  • textfinder.cpp
  • main.cpp
  • textfinder.ui
  • textfinder.pro

Файлы.h и.cpp содержат необходимые строки кода; файл.pro также завершён.

Заполнение недостающих кусков

Мы начнём с проектирования интерфейса пользователя и затем перейдём к заполнению недостающего кода. В заключение мы добавим поиск.

Проектирование пользовательского интерфейса

Для начала проектирования интерфейса пользователя, щёлкните два раза на файле textfinder.ui в вашем обозревателе проекта . Это запустит интегрированный Qt Designer.

Спроектируйте форму выше с использованием QLabel , QLineEdit (назовите его lineEdit), QPushButton (назовите её findButton) и QTextEdit (назовите его textEdit). Мы рекомендуем вам использовать QGridLayout для расположения QLabel , QLineEdit и QPushButton . QTextEdit можно добавить в QVBoxLayout помимо QGridLayout . Если вы новичок в проектировании форм с Qt Designer , вы можете взглянуть на руководство по Qt Designer .

Заголовочный файл

Файл textfinder.h уже имеет необходимые заголовочные файлы, конструктор, деструктор и объект Ui . Нам необходимо добавить закрытый слот on_findButton_clicked() для выполнения операции поиска. Нам также необходима закрытая функция loadTextFile() для чтения и отображения содержимого входного файла в QTextEdit . Это делается следующим кодом:

Private slots: void on_findButton_clicked(); private: Ui::TextFinder *ui; void loadTextFile();

Замечание: Объект Ui::TextFinder уже предоставлен.

Файл исходных кодов

Теперь, когда наш заголовочный файл завершён, перейдём к файлу исходных кодов textfinder.cpp . Мы начнём с заполнения функциональности для загрузки текстового файла. Это описано в куске кода ниже:

Void TextFinder::loadTextFile() { QFile inputFile(":/input.txt"); inputFile.open(QIODevice::ReadOnly); QTextStream in(&inputFile); QString line = in.readAll(); inputFile.close(); ui->textEdit->setPlainText(line); QTextCursor cursor = ui->textEdit->textCursor(); cursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor, 1); }

Мы загружаем текстовый файл используя QFile , читаем его с помощью QTextStream , а затем отображаем его в textEdit с помощью setPlainText() , что требует добавления дополнительных директив #includes в textfinder.cpp:

#include #include

Для слота on_findButton_clicked() мы извлекаем строку поиска и используем функцию find() для поиска строки в текстовом файле. Это описано в куске кода ниже:

Void TextFinder::on_findButton_clicked() { QString searchString = ui->lineEdit->text(); ui->textEdit->find(searchString, QTextDocument::FindWholeWords); }

После того как эти функции завершены, мы вызываем loadTextFile() в нашем конструкторе.

TextFinder::TextFinder(QWidget *parent) : QWidget(parent), ui(new Ui::TextFinder) { ui->setupUi(this); loadTextFile(); }

Слот on_findButton_clicked() будет вызван автоматически в этой строчке:

QMetaObject::connectSlotsByName(TextFinder);

в файле ui_textfinder.h , сгенерированном uic.

Файл ресурсов

Нам потребуется файл ресурсов (.qrc) в котором мы сохраним текстовый файл. Это может быть любой файл.txt с абзацем текста. Чтобы добавить файл ресурсов щёлкните правой кнопкой мыши на Файлы ресурсов в обозревателе проектов и выберите Добавить новый файл... . Вы увидите диалог мастера, показанный ниже.

Введите "textfinder" в поле Имя и используйте заданный Путь . Затем щёлкните Вперёд .

На этой странице вы можете выбрать в какой проект вы хотите добавить новый файл. Убедитесь, что пункт Добавить в проект выбран, а "TextFinder" выбран как Проект , и щёлкните на Завершить .

Ваш файл ресурсов будет отображён в редакторе ресурсов. Щёлкните на выпадающем списке Добавить и выберите Добавить приставку . Приставка, которая нам требуется, это просто косая черта (/). Щёлкните на Добавить снова, но на этот раз выберите Добавить файлы . Найдите текстовый файл, который вы хотите использовать, мы будем использовать input.txt .

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

Сборка и запуск вашего приложения

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

Это кросс-платформенный инструментарий разработки ПО на языке программирования C++. Есть также «привязки» ко многим другим языкам программирования: Python - PyQt, Ruby - QtRuby, Java - Qt Jambi, PHP - PHP-Qt и другие.
Позволяет запускать написанное с его помощью ПО в большинстве современных операционных систем путём простой компиляции программы для каждой ОС без изменения исходного кода. Включает в себя все основные классы, которые могут потребоваться при разработке прикладного программного обеспечения, начиная от элементов графического интерфейса и заканчивая классами для работы с сетью, базами данных и XML. Qt является полностью объектно-ориентированным, легко расширяемым и поддерживающим технику компонентного программирования.
В этой статье я покажу как написать простую программу «Hello, World!» с использованием библиотеки Qt4

Среда разработки

Сначала определимся со средой разработки. Лично я для написания программа использую кросс платформенную IDE Code::Blocks (подробнее про работу в этой IDE с Qt4 можно почитать ). Так же есть плагины для работы с Qt в Eclipse. Коммерческая версия Qt под MS Windows может быть интегрирована в MSVS. Программы так же можно писать в любом текстовом редакторе, а потом компилировать их из командной строки.
Для наглядности, я покажу как компилировать программы, написанные на Qt, вручную.

Первая программа

Сначала в любом текстовом редакторе создадим файл и назовем его, например, main.cpp
Напишем в нем следующее:
  1. #include
  2. #include
  3. QApplication app(argc, argv);
  4. QDialog *dialog = new QDialog;
  5. QLabel *label = new QLabel(dialog);
  6. label->setText("Hello, World!" );
  7. dialog->show();
  8. return app.exec();

В строках 1 и 2 мы подключили заголовочные файлы Qt в которых находятся основные классы.
В строке 4 мы объявили функцию main - главную функцию, с которой начинается выполнение любой программы. Она возвращает целое число (результат работы программы; 0 - если все в порядке) и принимает на вход две переменные - число параметров командной строки и массив, в котором они сохранены.
В строке 5 мы создаем объект приложения. Этому объекту мы передаем переменные командной строки.
В строке 6 мы создаем диалог - графическое окно прямоугольной формы, с заголовком и кнопками в верхнем правом углу. Создаем метку (строка 7). При создании метки мы передаем ее конструктору указатель на диалог, который становится ее родителем. При удалении родителя автоматически удаляются все его потомки, что очень удобно. Затем устанавливаем надпись метки путем вызова функции setText() (строка 8). Как видно из примера, для отображаемого текста можно использовать html-теги.
В строке 9 мы отображаем наше диалоговое окно с меткой на экране.
И, наконец в строке 10 мы запускаем цикл обработки событий операционной системы приложением. Результат работы объекта мы возвращаем как результат работы программы.

Компиляция

Теперь скомпилируем написанную программу.
Перейдем в каталог, куда мы сохранили наш файл main.cpp и выполним команду

$ qmake -project

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

TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

# Input
SOURCES += main.cpp

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

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

Вторая программа

Что бы получить полный контроль над создаваемыми окнами и другими виджетами, необходимо создавать производные от них классы. Создадим производный класс MyDialog. В качестве родительского будем использовать класс QDialog. Описание нашего класса поместим в заголовочный файл mydialog.h:
  1. #include
  2. #include
  3. #include
  4. #include
  5. class MyDialog: public QDialog {
  6. Q_OBJECT
  7. public :
  8. MyDialog(QWidget *parent = 0);
* This source code was highlighted with Source Code Highlighter .
В первых четырех строках мы подключаем необходимые заголовочные файлы используемых графических элементов - диалога, кнопки, надписи и вертикального менеджера компоновки. Использовать такие крупные заголовочные файлы как , и др. в больших проектах не рекомендуется, так как это увеличивает время компиляции.
В шестой строке мы определили наш класс производным от QDialog.
На следующей строчке мы указали макрос Q_OBJECT, который указывает предпроцессору Qt что данный класс будет использовать дополнительные возможности Qt, например, систему сигналов и слотов.
На строке 9 мы указываем конструктор нашего диалогового окна. У него только один входной параметр - указатель на родительский объект (0 если родителя нет).
Конструктор нашего класса мы определим в файле mydialog.cpp:
  1. #include "mydialog.h"
  2. MyDialog::MyDialog(QWidget *parent) : QDialog(parent) {
  3. QVBoxLayout *layout = new QVBoxLayout(this );
  4. QLabel *label = new QLabel(this );
  5. label->setText("Hello, World!" );
  6. QPushButton *button = new QPushButton(this );
  7. button->setText("Close" );
  8. layout->addWidget(label);
  9. layout->addWidget(button);
  10. connect(button, SIGNAL(clicked()), this , SLOT(close()));
* This source code was highlighted with Source Code Highlighter .

В строке 4 мы создаем менеджер компоновки, который будет автоматически отображать все добавленные в него виджеты вертикально. Создание надписи аналогично предыдущему примеру.
В строках 7 и 8 создаем кнопку и устанавливаем ее текст. На следующих двух строчках мы добавляем наши виджеты в менеджер компоновки что бы он их автоматически упорядочил.
В строке 11 мы подключаем сигнал нажатия clicked() кнопки button к слоту close() нашего диалогового окна. У каждого объекта Qt могут быть свои сигналы и слоты, которые можно подключать к сигналам и слотам других объектов и таким образом осуществлять коммуникацию между элементами программы.
Файл main.cpp примет следующий вид:
  1. #include
  2. #include "mydialog.h"
  3. int main(int argc, char * argv) {
  4. QApplication app(argc, argv);
  5. MyDialog *dialog = new MyDialog;
  6. dialog->show();
  7. return app.exec();
* This source code was highlighted with Source Code Highlighter .

Пересоздаем проект командой

$ qmake -project

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

Третья программа

Если диалоговое окно содержит много графических элементов, то создавать такие окна довольно утомительно. Для упрощения этого процесса есть инструмент под названием Qt Designer. Запускаем его

И выбираем создание диалогового окна без кнопок. Добавляем на него метку и кнопку, редактируем их текст. С помощью инструмента редактора сигналов и слотов (Signal/Slot Editor) подключаем сигнал нажатия clicked() кнопки button к слоту close() диалогового окна. Располагаем их вертикально с помощью менеджера компоновки. Сохраняем полученный файл под именем mydialog.ui. Позже он будет автоматически преобразован в заголовочный файл с именем ui_mydialog.h.
Изменяем заголовочный файл нашего диалогового окна mydialog.h следующим образом:

Первая часть статьи. Базовый обзор возможностей Qt и запуск первой Windows программы.

Приветствую тебя дорогой читатель. В этой статье мы поговорим о том как в QT можно создать первое оконное приложение используя только команды и главный файл main.cpp. Данная статья будет разделена на 2 части. В первой части мы с вами создадим само приложение и запустим его на компиляцию при помощи компилятора MinGW с очень короткими комментариями по коду, а во второй части мы разберем весь код до последней детали чтобы у вас сформировалось полное базовое понимание о том как все это работает. Итак пожалуй начнем. Первое что нам необходимо сделать это запустить QT Creator и создать проект. Я думаю нет необходимости объяснять как запустить QT Creator, так что мы начнем сразу с создания проекта.

Видео урок по данной статье

После того как QT запустился нажмите на кнопку новый проект как показано на скриншоте ниже.

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

После того как вы нажали кнопку выбрать… У вас откроется следующее окно выбора дополнительных параметров, где вам будет предложено выбрать имя вашего проекта и где он будет храниться. ВАЖНО: Не допускайте русских символов в пути где у вас будет храниться ваш проект, Qt не дружит с русскими символами. Эта мера необходима чтобы в дальнейшем избежать ошибок при сборке проекта. Ниже приведен пример как правильно создать имя и путь к проекту Qt.

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

Далее Qt нам предлагает выбрать комплект при помощи которого мы будем разрабатывать наш проект, я выбрал комплект Desktop Qt 5.8.0 с компилятором от MinGW 32 bit. Вы можете оставить значение по умолчанию или сделать свой выбор комплекта или даже комплектов для разработки вашей программы.

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

После этого у нас откроется последнее окно в котором будет собрана вся суммарная информация по создаваемому проекту, также в этом окне нам будет предложено создать наш проект как подпроект нашего предыдущего и добавить под контроль версии проекта. Но так как у нас нет ни того ни другого, мы просто нажимаем кнопку завершить как показано на скриншоте ниже.

После того как наш конструктор приложений завершился пришло самое время настроить наш проект так чтобы у нас была возможность выполнить простейшую программу для вывода текста на экран и проверки правильности работы нашего фреймворка. Для начала нам необходимо удалить из нашего проекта все файлы кроме файла main.cpp — вот в этом файле мы и будем в дальнейшем прописывать код для запуска окна с выводом текста в оконном режиме. Вам необходимо оставить все так же как показано на скриншоте ниже после удаления лишних файлов из проекта.

Скриншот до удаления файлов из проекта:

Чуть ниже вы можете увидеть скриншот созданного проекта конструктором Qt без изменений.

До удаления лишних файлов из проекта

Скриншот после удаления файлов из проекта:

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

Разработка простейшего кода для оконного приложения:

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

на Русском языке без проблем с кодировкой. Данная проблема уже была предусмотрена в Qt и решена внутренними инструментами.

Для начала добавим следующий код в наш файл main.cpp

Запустите ваш код при помощи зеленого треугольника слева или сочетанием горячих клавиш Ctrl+R. В итоге у вас должно получиться окно с текстом Привет мир!!!

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

Вторая часть статьи. Подробный разбор кода:

До текущего момента мы с вами разобрались как можно создать простейшую программу которая только в окне выводит текст не разбираясь в подробностях кода. Теперь пришло самое время разобраться с теми командами которые мы использовали в нашей программе. Первое что мы с вами сделали, это подключили библиотеку QtWidgets — Данная библиотека включает в себя около 300 различных библиотек направленных на создания оконных приложений. Еще QtWidgets можно назвать складом строительных материалов для различных оконных приложений. Можно было конечно подключить отдельно библиотеки такие как QLabel для создания окон Windows и QApplication для обработки строк с различными аргументами. Но у нас стал бы код чуть длиннее и чуть труднее читаем. А теперь представьте если бы вы создавали программу в которой куча разных функций. И вы бы подключали к каждой функции свою библиотеку. Спустя какое то время вы бы с трудом смогли вспомнить для чего подключено такое большое количество библиотек. Вот как раз в таких случаях и выручают большие библиотеки которые содержат в себе уже весь необходимый строительный материал для создания к примеру оконных программ как QtWidgets.
Вот собственно говоря весь код нашей программы, чуть выше мы с вами уже разобрали библиотеку QtWidgets

#include // Подключаем библиотеку QtWidgets в которую //входит около 300 различных классов для разработки оконных приложений. //В том числе и такие как QApplication и QLabel. int main(int argc, char **argv){ QApplication app(argc, argv); QLabel lbl("Привет мир!!!"); // Создаем конструктором окно с текстом Привет мир!!! lbl.show(); // Обращаемся к методу(функции) show() для вывода информации на экран return app.exec(); // Проверяем сигнал закрытия окна через объект app при помощи метода(функции) //exec() которая перехватывает различные действия происходящие в программе. //Это необходимо для корректного завершения программы, чтобы после закрытия //окна программы она не занимала место в оперативной памяти и не напрягала //процессор в фоновом режиме. }

#include // Подключаем библиотеку QtWidgets в которую

//входит около 300 различных классов для разработки оконных приложений.

//В том числе и такие как QApplication и QLabel.

int main (int argc , char * * argv ) {

QApplication app (argc , argv ) ;

QLabel lbl ("Привет мир!!!" ) ; // Создаем конструктором окно с текстом Привет мир!!!

lbl . show () ; // Обращаемся к методу(функции) show() для вывода информации на экран

return app . exec () ; // Проверяем сигнал закрытия окна через объект app при помощи метода(функции)

//exec() которая перехватывает различные действия происходящие в программе.

//Это необходимо для корректного завершения программы, чтобы после закрытия

//окна программы она не занимала место в оперативной памяти и не напрягала

//процессор в фоновом режиме.

Теперь давайте разберем наш пример. Сначала создается объект класса QApplication, который осуществляет контроль и управление приложением. Для его создания в конструктор этого класса необходимо передать два аргумента. Первый argc аргумент представляет собой информацию о количестве аргументов в командной строке, из которой происходит обращение к программе, а второй argv - это указатель на массив символьных строк, содержащих аргументы, по одному в строке. Любая использующая Qt программа с графическим интерфейсом должна создавать только один объект этого класса, и он должен быть создан до использования операций, связанных с пользовательским интерфейсом.

Затем создается объект класса QLabel. После создания элементы управления Qt по умолчанию невидимы, и для их отображения необходимо вызвать метод show(). Объект класса QLabel является основным управляющим элементом приложения, что позволяет завершить работу приложения при закрытии окна элемента. Если вдруг окажется, что в созданном приложении имеется сразу несколько независимых друг от друга элементов управления, то при закрытии окна последнего такого элемента управления завершится и само приложение. Это правильно, иначе приложение осталось бы в памяти компьютера и расходовало бы его ресурсы.
Наконец, в последней строке программы приложение запускается вызовом
QApplication::ехес(). С его запуском приводится в действие цикл обработки событий, определенный в классе QCoreApplication, являющемся базовым для QGuiApplication, от которого унаследован класс QApplication. Этот цикл передает получаемые от системы события на обработку соответствующим объектам. Он продолжается до тех пор, пока либо не будет вызван статический метод QCoreApplication::exit (), либо не закроется окно последнего элемента управления. По завершению работы приложения метод QApplication::ехес() возвращает значение целого типа, содержащее код, информирующий о его завершении. После того как вы создали весь код и запустили программу – у вас должен получиться следующий результат.

Теперь пришло самое время разобраться как работают теги из HTML(язык гипертекстовой разметки) и CSS(каскадные таблицы стилей).

Когда вы создаете объект и передаете конструктору информацию в двойных кавычках, то конструктор автоматически создает окно при помощи QLabel и создает там текстовое поле в котором собственно и будет выводиться ваш текст. Благодаря новым возможностям от Qt есть возможность использовать различные теги от HTML и CSS. Такая возможность позволяет оформлять различные элементы программы в различных стилях что очень сильно помогает в разработке дизайна программ. Главное не забывать о том что в HTML и CSS используются такие спец. Символы как точка с запятой и двойные кавычки в для написания нескольких свойств в CSS для текста или какого то объекта. В Qt придется забыть о данных знаках при написания кода оформления в двойных кавычках так как это может вызвать ошибку при компиляции. А вот что касается простеньких свойств в HTML и CSS которые имеют не более 1 параметра, то здесь работает все корректно. Ниже привел пример оформления, с кодом вы можете ознакомится на скриншоте.

Чуть выше на скриншоте вы можете увидеть как буквально в 1 строку кода мы оформили текст в разной цветовой гамме, так же задали размер заголовка текста и добавили пару переносов строки. А теперь судите сами на сколько упрощает жизнь при оформлении программы при использовании языка гипертекстовой разметки и каскадных таблиц стилей.

На этом пожалуй все что я хотел рассказать в данной статье, пишите в комментариях ваши мысли, предложения. Комментарии буду публиковаться все кроме спама и не обоснованной критики. Все остальные комментарии будут опубликованы.

Так же большая просьба написать в комментариях, насколько бы вам было интересно начать параллельное изучение HTML и CSS для Qt.