Кьют-программирование

Версия для печатиВерсия для печати

Многие разработчики игнорируют "Линукс", считая, что в "Линуксе" нет достойных свободных и бесплатных RAD-сред скоростной разработки проектов. Однако это не так, и я попробую это показать.


Устанавливаем Кьют

Историю 3-этажного инструмента QDevelop + QT4 + QT-designer рассказывать не буду, кто желает - может почитать в Википедии. Предпочтительный, на мой взгляд, порядок установки и освоения этих этажей следующий: устанавливаем QT-designer (далее - кьют-дизайнер), проверяем, работает ли он, устанавливаем инструментарий QT4 (далее - кьют4), проверяем, работают ли демонстрационные примеры, устанавливаем QDevelop (далее - кьют), проверяем, что всё работает, пишем свой первый проект, компилируем, собираем и сравниваем результаты с аналогичным проектом на Билдере.

Я, как и многие соотечественники, мученик дайлапа. Но есть способ облегчить свою участь. Если вы заранее скачаете deb-пакет и запишете его в директорию /var/cache/apt/archives, то при инсталляции пакета командой sudo apt-get install имя_пакета даже при включённом Интернете установка пойдёт именно из этой директории, правда, при условии, что в доступных репозиториях не содержится обновлённая версия пакета. Большие пакеты я скачивал, пользуясь услугами сервисных пунктов РУП "Белтелеком". Мелкие устанавливал из Интернета. Кьют4 пришлось скачать в виде сжатого тарболла и скомпилировать. О порядке компиляции чуть позже. Всего затрат получилось примерно на 20 тыс. белорусских рублей, столько же стоили бы CD-носители, если бы их можно было купить. :) Прежде всего отмечу, что кьют-инструментарий устанавливался на Линукс Ubuntu-8.10, а текущая версия кьют-пакетов - 4.4.3. До начала установки кьюта необходимо с помощью менеджера обновлений проапдейтить все ранее дистрибутивно установленные пакеты, начинающиеся с букв qt4, затем скачать и установить следующие deb-пакеты: libqt4-dbg (86 Мб) и lib-qt4-dev (52 Мб). Эти самодостаточные пакеты можно взять по http-ссылкам:

ie.archive.ubuntu.com intrepid/main libqt4-dbg 4.4.3-0ubuntu1
ie.archive.ubuntu.com intrepid/main qt4-doc 4.4.3-0ubuntu1

Остальные пакеты не являются самодостаточными, при их установке удовлетворяются перекрёстные зависимости, и их придётся устанавливать из Интернета. К счастью, на дистрибутиве Ubuntu-8.10 уже имеются некоторые пакеты, поэтому заранее вставьте диск с дистрибутивом в привод. Вот пакеты, которые необходимо установить из Интернета, чтобы заработал кьют-дизайнер форм:

libqt4-core
libqt4-gui
libqt4-q3support
libqt4-sql
libqt4-dev
qt4-qtconfig
exuberant-ctags
cmake
qt4-designer

После установки вышеперечисленных пакетов пытаемся запустить кьют-дизайнер, набрав в терминале designer. Если всё сделано правильно, то он запустится. Кроме того, в системном линукс-меню Приложения>Программирование появится иконка, поименованная Qt 4 дизайнер. 1-й шаг сделан.

Теперь ищем в Интернете и скачиваем сжатый тарболл кьют-инструментария qt-x11-opensource-src-4.4.3.tar.gz. Это около 100 Мб. Всю установку производим под рутом или под суперпользователем. До установки кьюта-4 предварительно устанавливаем из Интернета компилятор g++, если его нет. Затем терминальной командой mkdir /tmp создаём временную директорию tmp и копируем в неё сжатый тарболл. Командой cd /tmp переходим в эту директорию. Командой gunzip qt-x11-opensource-src-4.4.3.tar.gz разожмём тарболл, а командой tar xvf qt-x11-opensource-src-4.4.3.tar распакуем его. После распаковки в компьютере должна обнаружиться директория /tmp/qt-x11-opensource-src-4.4.3. Переходим в эту директорию и конфигурируем сборку командой ./configure. По умолчанию кьют-4 будет устанавливаться в директорию /usr/local/Trolltech/Qt-4.4.3. Запускаем сборку командой make, ждём полтора часа (и это компьютер-двухядерник!). По окончанию сборки, если она успешна, командуем make install. Для работы "Линуксу" понадобится знать путь к кьют-инструментарию. Для этого запускаем команду gedit ~/.bashrc, чтобы подредактировать профиль, и в конец файла .bashrc добавляем строки:

PATH = /usr/local/Trolltech/Qt-4.4.3/bin:$PATH
export PATH

Сохраняем файл, перезагружаемся. Командой echo $PATH проверяем, что нужный путь действительно существует. Чтобы проверить, работает ли кьют-4, проще всего запустить демо-примеры. Для этого из Интернета командой sudo apt-get install устанавливаем пакет qt4-demos и запускаем примеры терминальной командой qtdemo. Если примеры запускаются, то 2-й шаг сделан. Правда, документация к примерам работать не будет, да и не все примеры будут запускаться.

Кьют устанавливается командой sudo apt-get install qdevelop. Смотрим системное Линукс-меню Приложения>Программирование. Там должны появиться ещё 3 иконки: QDevelop, Qt 4 Assistant, Qt 4 Linguist. Проверяем, что запускаются все демо-примеры, кроме примеров для баз данных, и документация к примерам работает. 3-й шаг сделан. Хватаем мышкой иконку QDevelop и вытягиваем из меню на рабочий стол. Всё, кьют установлен! Перезагружаемся.


Запускаем Кьют

В вашей личной директории /home/you создаём директорию qdevelop и в этой директории создаём другую директорию под названием apps. Последняя будет директорией по умолчанию для ваших проектов.

В главном меню QDevelop'а, т.е. кьюта, избираем Проект > Новый Проект. В окне, которое появляется, на панели "Шаблон" жмём радиокнопку "Приложение с main window". В этом же окне на панели "Свойства" в окне редактирования "Имя проекта" вводим имя myfirst или любое другое имя проекта. В окне "Путь" вводим путь к нашему проекту. Он запомнится на будущее. На панели "Версия" жмём радиокнопку "Отладочная версия". Остальное оставляем как есть и жмём ОК. Кьют создаст все необходимые директории и файлы для разработки кьют-приложения.

Протестируем пустой проект. В главном меню кьюта жмём Сборка > Сборка. Замечаем, что пошли сообщения в секции вывода внизу. Когда сборка завершается в норме, кьют сообщает, что "Сборка завершена без ошибок". Когда бы вы ни собирали свой проект, следите за этим окном вывода, чтобы дать завершиться сборке и случайно не запустить проект на выполнение. В главном меню кьюта жмём Отладка > Отладка. Через несколько мгновений ваше приложение заработает. Всё, что получится - чистое окно сервера X11, которое ничего не делает, но является стартовой точкой проекта. Закройте ваше новое кьют-приложение, и в главном меню изберите Отладка > Прервать.


Наполняем окно проекта

Я позаимствовал пример из clivecooper.co.uk/tutorial/index.html. Многое по ссылке устарело, но пример рабочий. Там же можно посмотреть и скриншоты. Сейчас мы сработаем настоящее кьют-приложение, которое кое-что может. Идея тестового кьют-приложения простая: пользователь вводит текст в строку редактирования, жмёт кнопку, и этот текст добавляется к тексту в списке. Наложим пользовательский интерфейс на главное окно проекта. В проводнике проекта (обозначен как "Файлы") слева от "Диалоги" кликаем по крестику и затем дважды кликаем по автоматически созданному файлу пользовательского интерфейса ui/mainwindow.ui. Ждём, пока загрузится и развернётся кьют-дизайнер. Он, к сожалению, не русифицирован. Лучше всего настроить кьют-дизайнер в виде единого приложения вместо набора разрозненных окон. Закройте окно New Form дизайнера, оно не нужно. В окне Qt Designer жмём Edit > Preferences. На панели User Preferences Mod щёлкните по переключателю и выберите Docked Window. OK. Окна кьют-дизайнера склеились и заняли весь экран. Перетащите кьют-дизайнер на свободный рабочий стол.

По умолчанию при запуске кьют создал главное окно с пустыми меню вверху и панелью состояния внизу. Уберём их. Кликаем по каждому из них правой кнопкой и выбираем удаления из контекстных меню. Устанавливаем подходящий размер окна нашего кьют-приложения. Перейдём к виджетам.

Виджеты - это множество визуальных объектов, которые могут быть помещены в форму окна. В отличие от билдерных визуальных компонент, виджеты не имеют тяжёлой наследственности и не являются "паскальными". В соответствии с идеей нашего приложения задействуем следующие виджеты: строку редактирования LineEdit, кнопку PushButton и список строк ListWidget. Чтобы поместить их в окно, кликаем по нужному виджету на панели виджетов, расположенной слева, и тащим его на форму окна. Список поместим над окном редактирования и кнопкой. На форме окна виджеты выделяются точно так же, как в "Билдере" или в "Делфи". Обводкой выделим LineEdit и PushButton. Жмём кнопку Lay Out Horizontally. Выделенные виджеты прижались друг к другу. Выделяем все виджеты на форме и жмём кнопку Lay Out Vertically. Все виджеты прижались друг к другу. Фиксируем дизайн нажатием кнопки привязки Lay Out in a Grid. Удобнее, чем в "Билдере".

Зададим виджетам некоторые свойства. Для этого на форме окна выделим кнопку, в редакторе свойств щёлкнем по Object Name и изменим имя PushButton на btAdd, затем таким же образом свойству Text присвоим &Add. Поменяем с помощью редактора свойств имена других виджетов: LineEdit заменим на edText, ListWidget заменим на ibMyList. Поправим бордюр между виджетами и кромкой окна. Для этого в инспекторе объектов Object Inspector щелчком выделяем элемент centralwidget, идём в редактор свойств на самый его низ и уменьшаем значения полей. Существует множество других свойств виджетов; можно поэкспериментировать. А пока в главном меню дизайнера жмём File > Save. С дизайном формы закончено, закрываем кьют-дизайнер File > Quit и возвращаемся к кьюту.

Проверим, что проект компилируется. В главном меню кьюта жмём Сборка > Сборка, и когда сборка завершится, в главном меню жмём Отладка > Старт программы. Кьют-приложение заработает, и вы увидите окно кьют-приложения таким, каким вы его спроектировали. Размеры окна можно изменять, при этом автоматически изменяются размеры его содержимого.


Пишем код

При написании простых кьют-приложений, в основном, пишут кьют-код и немного обычного кода на C/C++. Большинство пособий по C/C++ глубоко вдаются в нюансы языка, но если вы являетесь разработчиком небольших приложений для личного потребления, то 90% всего, что вы знаете о C/C++, вам, скорее всего, не понадобится. Но азы всё же потребуются.

Базовые понятия в кьют-программировании - SIGNAL и SLOT. Неточная аналогия - событие и обработчик события в "Билдере" или в "Делфи". Различные виджеты выдают сигналы, и вы можете подключать эти сигналы к слотам. Один из сигналов, выдаваемых кнопкой, называется clicked(), и если мы хотим что-либо выполнить при нажатии кнопки, то нужно написать свою собственную функцию слота и подключить сигнал clicked() к этому слоту. Вообще, чтобы разобраться, какие сигналы может выдавать виджет, выделите его в кьют-дизайнере и нажмите F1. Помощник расскажет. Свяжем сигнал со слотом. Вот код, создающий такую связку:

connect( btAdd, SIGNAL( clicked() ), this, SLOT( addClicked() ) );

Здесь кнопка btAdd выдаёт сигнал clicked(), подключаемый к функции с именем addClicked(). Слово this является указателем на класс окна. Строку кода связки сигнал/слот надо вписать в класс MainWindowImpl окна кьют-приложения. Для этого в окне "Файлы" кьюта щёлкаем по плюсу возле группы файлов "Исходники" и выбираем файл mainwindowimpl.cpp. Текст этого файла появляется в окне редактора файлов. Вписываем строку связки сразу после строки инициализации графического интерфейса setupUi(this). Слот addClicked() также является членом класса MainWindowImpl главного окна приложения, поэтому в файл mainwindowimpl.cpp впишем пока заглушку, чтобы компилятор не выдавал ошибок:

void MainWindowImpl::addClicked()
{
}

В редакторе исходника главного окна находим текст, сгенерированный кьютом

#include "mainwindowimpl.h"
MainWindowImpl::MainWindowImpl( QWidget* parent, Qt::WFlags f)
: QMainWindow(parent, f)
{
setupUi(this);
connect(btAdd, SIGNAL(clicked()), this, SLOT(addClicked()));
}

и вписываем заглушку. Слоты должны быть объявлены как слоты в заголовочном файле с расширением .h. Для этого в окне кьюта "Файлы" щёлкаем по плюсу возле группы файлов "Заголовки" и редактируем файл mainwindowimpl.h. В секцию private slots вручную вписываем объявление функции слота void addClicked(). Должен получиться следующий .h-файл, в который добавлено объявление слота:

#ifndef MAINWINDOWIMPL_H
#define MAINWINDOWIMPL_H
#include "ui_mainwindow.h"
class MainWindowImpl : public QMainWindow, public Ui::MainWindow
{
Q_OBJECT
public:
MainWindowImpl( Qwidget * parent = 0, Qt::WFlags f = 0 );
private slots:
void addClicked();
};
#endif

Слот пока пуст, и мы ещё должны написать код для него. Но пока проверим код на отсутствие ошибок. Жмём Собрать > Пересобрать. Если нет ошибок - хорошо, если есть - исправляем и пересобираем. Вот код для слота, который будет выполняться при каждом нажатии кнопки:

void MainWindowImpl::addClicked()
{
if(edText->text() == "")
return;
ibMyList->addItem(edText->text());
edText->setText("");
edText->setFocus();
}

Если вы замените слот-заглушку на этот текст, соберёте приложение и запустите, то всё заработает. Если нет - ищите ошибки. Итак, проект работает. Заглядываем файловым менеджером, например, "Наутилусом", в директорию /home/you/qdevelop/apps/myfst/bin и смотрим размер полученного исполняемого файла myfst. Он должен иметь размер порядка 380 килобайт. Многовато для такого простого проекта. Вспоминаем, что мы его компилировали и собирали как отладочную версию. Изменим свойства проекта. Для этого в главном меню кьюта выбираем Проект > Свойства myfst.pro, идём на вкладку "Конфигурация" и на панели "Версия" жмём сначала release, затем ОК. Жмём Проект > Пересобрать. Ждём, готово. Снова заглядываем в директорию /home/you/qdevelop/apps/myfst/bin и смотрим размер исполняемого файла myfst. 27 килобайт! Разве "Билдер" на такое способен?

Михаил ГУРЧИК,
gor-mike@tut.by


Об авторе

Михаил Гурчик - профессиональный разработчик электронной аппаратуры. Закончил МРТИ в 1974 г. Трудовой путь: МРТИ - 5 лет (старший инженер), БелТЭИ - 20 лет (старший научный сотрудник), последние 8 лет работает в частной фирме. Линуксом пользуется полгода, до этого 20 лет писал софт на C/C++ под DOS и под Windows.

Номер: 

01 за 2009 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Страницы

Аватар пользователя Andrew
Автор издевается? "Самодостаточный пакет" — что это за ересь? Всё само вытягивается по зависимостям. И, кстати, для кого придуманы -dev-пакеты? Зачем исходники собирал-то? Нельзя было сделать apt-get install libqt4-dev qt4-dev-tools qt4-doc?

В общем, "незачёт".

Аватар пользователя Savely
mike(old student) решил-таки составить конкуренцию Станкевичу? :-))
Аватар пользователя mike
>Зачем исходники собирал-то? Нельзя было сделать apt-get install libqt4-dev qt4-dev-tools qt4-doc?

Разумеется, можно. Но исходники имеют фирменные правки, которые по времени впереди изменений в репозиториях.

>"Самодостаточный пакет" — что это за ересь?

Не знаю, как у Andrew, но у меня указанные пакеты НОВЫХ пакетов при установке не потянули. Это, конечно, не самодостаточность, согласен. Впредь буду аккуратнее в выражениях.

>решил-таки составить конкуренцию Станкевичу?

В мыслях не было.

Аватар пользователя Инкогнито
Форумный бред майка плавно перетекает на страницы газеты. Да, в стране действительно кризис.
Аватар пользователя интернетчик
Новому автору "КВ" прывитанне! Первый блин вполне съедобный получился. :)
Аватар пользователя Эдуард Трошин
Наконец-то, Майк! И вы в наших рядах! Ждали столько лет-то....:-)
Аватар пользователя Эдуард
С дебютом, Вас Майк :).
Аватар пользователя Andrew
Ну ошибся я в списке пакетов, давно уже qt ставил. Но проблем никаких не было, а насчёт "фирменных правок" — это далеко не так, иногда дистрибутивные версии имеют фишки, которых в апстриме ещё нет, пример – avrdude в Debian
Аватар пользователя Вадим Станкевич
Майк, то есть, Михаил, поздравляю! Отличная статья! Давно ждал, когда Вы решите всё-таки опубликоваться.
Аватар пользователя mike
Спасибо, парни, за замечания и пожелания.

Страницы

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