Программа для компьютера в KDevelop
Причина, по которой я хочу рассказать о другой среде программирования, именно KDevelop, работающей с операционной системой Linux, - в ее большей доступности для многих, чем Visual Basic. Эта среда программирования входит в состав многих Linux-дистрибутивов. Хотя она и не единственная в них.
Итак, я предполагаю работать с релейным модулем. По этой причине я программирую микроконтроллер соответствующим образом и загружаю на компьютере ASPLinux. Я уже говорил, что эта операционная система поставляется с огромным количеством приложений, в частности, и для разработки программ.
Запускаем программу KDevelop. Моя версия в данный момент предоставляет в меню запуска возможность выбрать язык программирования и вариант проекта, хотя это можно сделать и несколько позже. Итак, я запускаю KDevelop в разделе основного меню Приложения Разработка KDevelop KDE/C++. Если это первый запуск, ни один проект не открывается, если повторный запуск, открывается последний проект, над которым вы работали. Для создания нового проекта предыдущий следует закрыть и выбрать в меню KDevelop Проект Новый проект (рис. П.8).
Файл Правка Вид Проект Оборка Отладка Сценарии Qmo Сервис Ьжтройка j
Sactanu»
А «і
ЕЙКОЕ
■*»Appicaflc framework KParts) IftKate plugin w»h con»o page ifcKFIepkigin -*lKHTMLP«rt plugin 4Ц Kicker Applet 3&KIO slave #KOicePart
^•Conqueror Navigation Panel Plugin &Noatun visuatoaflon plugin ^Score-based KMDI applcafen feSlmple DCOP server %Smple Designer based КОЕ Applcatton «Simple КОЕ Application fcY^ekm bynthatqcf Noabn
Импорт иэ КВе
_
[
□ □оказать все шаблоны проекта
FoonWvladn»/
Конечное расположение /homaMacfcntf (неверно)
- W'ya»»** Поиска» |
.Заменить MKonsoie |
АПР*ж*в«ЙР Просмотр различий О О Создать новый проект иэ шаблона
Рис. П.8. Создаем проект в KDevelop
В диалоговом окне выбираем С++ KDE Simple Designer based KDE Application, задаем имя проекта (в данном случае - book) и место его расположения (в данном случае - домашняя папка пользователя) - рис. П.9.
Теперь нам остается щелкнуть несколько раз кнопку Next, при этом можно сделать уточнения, относящиеся к проекту, но эти действия можно осуществить и позже. Заканчивается
Вид Проект Сборка Отладка Сценарии Окно Сервис Настройка Справка
Все проекты ДОраиное
Эйк0є
& Apple aOon framework (KParts)
Kale plugin w*h conig page ^KFileplugm ttKHTMLPart plugin ifcKicker Applet &KIO slave «.КОвсе Part
2«йл Ораека ®QQ Q |
■ftKonqueror Navigation Panel Plugin &Noatun visualization plugin iatSconvbased KMDI application «.Simple PCOP server
^Simple КОЕ Application аУЦкт byrrthatqef Noatun «.Импорт из KBear
Оокаэать все шаблоны проекта
Jbook2 ./home/vladimW |
Имя приложения; Е«с положение: Конечное расположі
□ВЕЗ fern
•.Приложение 4 Просмотр различий О Сообщении # Vatgrind Щ Поиск в файлах iX Заменить]** Console] Создать новый проект из шаблона
Рис. П.9. Выбираем тип проекта в KDevelop
Оформление проекта, когда кнопка Next превращается в кнопку Готово, которую и щелкаем в последний раз, получая проект.
Щелкнув на правой инструментальной панели ярлычок Automake Manager, открываем окно менеджера, в котором можно открыть все файлы проекта и файлы заголовков двойным щелчком кнопки мышки. Я открыл файл bookwidgetbase. ui (рис. П.10).
Файл интересен тем, что относится к встроенному редактору интерфейса программы. Окно с кнопкой Click Me! появится после компиляции и сборки проекта при запуске программы. Для компиляции и сборки сначала в основном меню выбираем Сборка Запустить automake и др... В нижней части открывается окно сообщений, где показывается процесс сборки (рис. П. 11).
Затем мне приходится сделать лишнее «телодвижение» - после одного из экспериментов в KDevelop с разными языками программирования мне приходится поправлять файл configure. sh, который находится в папке проекта book.
Рис. П. 10. Встроенный графический редактор KDevelop
T к д ft R у
M |
Fe jl(noftincflon) Щ^ДОО iff С® ?> 6
Abook2xpp fenttwUgetbe^
•Dont target to fun /conDgure
•if you hevent done so In a while, run Усопідиге - help
£ jj фияожеш»-• ■ Просмотрржшичий < V«)grind.^ ^Поискефайлах^ уЗамениг»]*4 KoneotT.
I Строка 3 Столбу 23 ВСТАВКА ОБЫЧНОЕ •
Рис. П.11. Окно процесса сборки проекта
Я открываю файл текстовым редактором, удаляю показанную часть текста почти в самом начале файла и сохраняю файл:
# Support unset when possible.
If ( (MAIL=60; unset MAIL) I I exit) >/dev/null 2>&1; then
As_unset=unset else
As_unset=false fi
Без этой операции появляются сообщения об ошибках при конфигурировании проекта, которое запускается в разделе основного меню Сборка Запустить configure. После завершения этого процесса можно запустить сборку Сборка Собрать проект или сразу запустить программу Сборка Выполнить программу, что приведет к сборке проекта и запуску программы.
Есть еще один момент, который привел меня в замешательство, но, возможно, это тоже результат моих экспериментов. Не получалась работа с графическим редактором интерфейса. Для его нормальной работы в опции проекта Проект Project Options Поддержка С++ на вкладке Автодополнение кода в части Code Complection Databases понадобилось с помощью кнопки Добавить добавить поддержку Qt (рис. П. 12).
После создания базы проблема перестала беспокоить. Qt, насколько я понимаю, - это мощная библиотека, поддерживающая графику. Разработана она фирмой Trolltech. Все графические объекты интерфейса - объекты этой библиотеки. Но вернемся к проекту.
Если теперь щелкнуть кнопку появившегося окна book Click Me!, появится традиционное для языка С - Hello World! Таким образом, почти незаметно для себя мы написали первую программу на языке С++, работающую с операционной системой Linux.
Теперь хотелось бы эту программу превратить в то, что нужно нам. Меня беспокоят некоторые аспекты предстоящей работы, но для начала я, выключив работающую
$айл Оряека Вид Проект Сборка Отдадса Сценарии Заклады» Окно Сервис Ьастройка Справка
Дааярг
... |
250 ffl миллисекунд |
93 • . жа символов иэ 6и( О Загрузка символов иэ люі |
^ (по function)
3 Поддержка С++ |
Общие 4 |
Fl6a>«e jfflt ]А»те-Яопоянениекада fcdeToaw доступа |
Выбор библиотеки |
^Управление вере - ОЗ ка символов иэ библиотеки KDE iba хранилище w
І Загрузка символов иэ любого каталога в хранилище к»
0 Документация проекта |
І^алить |
J |
Fmtel* •Oontferge •if you have Успей |
ГШ Овт» |
' Дале»» j Обмена
Л Приложение Просмотр различий 'фТЩЩт1!? Valgrind Поиск а файлах ^ ^ Ф Security Patterns 0 Точки останова ^сТав» 0 Проблемы Параметры проекта
Рис. П. 12. Добавление поддержки Qt
Программу, возвращаюсь в редактор интерфейса к файлу bookwidgetbase. ui. С этой небольшой проблемой я столкнусь позже, но хочу устранить ее сейчас. Существо проблемы в том, что возникают некоторые неприятности с изменением интерфейса, а, изменив интерфейс, я не смогу справиться с размерами окна при запуске программы. Окно останется в том же первозданном виде, что и при первом запуске.
Основу интерфейса, как и в других средах программирования, составляет форма, на которой размещаются кнопки, этикетки и т. д. - все составляющие формы. Кроме нее открыта инструментальная панель (слева), менеджеры проекта, свойств формы и ее составляющих (справа).
Для устранения проблемы, вероятно, есть более правильные пути, но я пошел следующим - щелкнув правой кнопкой мыши форму, в раскрывающемся меню выбирал пункт Разорвать расположение.
Строка. 3 Столбец 23 ВСТАВКА ОБЫЧНОЕ ♦ |
Теперь я могу работать с формой. На форме в данный момент одна этикетка - label, и одна кнопка - button. Для начала я увеличу размер формы и поменяю местами компоненты, изменив их размер (рис. П. 13).
Файл Правка Виа Проект Сборка Отдака Сценария Еослоложение Окно Сервис Цастроика Справка SQQ&titGi 4 $ :;(no (uncson)" fcfr 3 5 О Q №№(??> ^ BE и III = 8 н I I M Ft 1 , bookZxpp ^book2widgetba3e. g) | |
.ss |
«Пиюжаииа Просмотр рамичий ОСоо&цани* т Va^riod <4 Поиске фаимк Заменить ' ^CTees. O Проблемы
Рис. П. 13. Работа с формой в KDevelop
Кнопку я позже использую для работы с портом, а этикетку - для вывода сообщений о состоянии порта. Добавим разделители, как показано на рис. П. 14. Щелкнув правой кнопкой мыши форму, выбираем в раскрывающемся меню Lay Out in a Grid. Теперь при запуске программы окно приобретает вид, который бы мне хотелось видеть.
Однако вернемся к проблемам, вызывающим у меня беспокойство. Я бы сформулировал это так: «Плохо, когда забываешь то, что не знаешь. Особенно, если забываешь, что ты этого не знаешь!».
Производственная необходимость некогда заставила меня обратиться к языку С++, на котором я написал небольшую программку. Для знакомства с языком я законспектировал оригинальную версию книги Липпмана «Основы С++». С тех пор прошло достаточно времени, чтобы я все забыл. По этой причине я добавлю «шпаргалку», постаравшись не использовать сложные синтаксические или программные конструкции.
E О Secuty Problems ©ТочюкостаковІ |
Первое, что я запишу, поскольку всегда путаюсь.
Рис. П. 14. Придание форме нужного вида Указатели в С.
Пусть мы имеем переменную с именем var типа int (целое): int var;
Теперь создадим другую переменную, которую назовем: int* p_var.
Появившаяся звездочка говорит, что переменная p_var - это указатель. Если теперь мы присвоим этой переменной следующее значение:
P_var = &var,
То в переменной p_var будет храниться адрес первой переменной. Положим, есть еще одна переменная:
Int new_var
Мы можем добавить к первой переменной единицу, присвоив результат новой переменной:
New_var = var + 1
Но в языке С то же можно записать, используя указатели new_var = *p_var + 1
Звездочка в данном случае говорит о том, что мы используем значение переменной, адрес которой хранит переменная p_var.
Таким образом, &var - указывает, что используется адрес переменной var.
Int* p_var
P_var - это указатель, *p_var - показывает, что используется значение переменной, на которую указывает p_var. Указатели могут указывать на переменные, функции, другие указатели и т. д.
Не знаю, поможет ли вам моя шпаргалка, но для себя я ее оставлю, тем более что в «С++» без звездочек, разбросанных по всему тексту, шагу не ступишь.
Еще одна деталь. Когда я впервые столкнулся с KDevelop, это была версия без интегрированного в нее редактора интерфейса. Для этих целей использовалась отдельная программа Qt Designer (она и сейчас входит в дистрибутив). И это не единственная возможность создать графический интерфейс, как и KDevelop не единственная среда разработки на языке С. Объединение программы на языке С++ и графического интерфейса выглядело несколько иначе, что заставляет меня, как мне кажется, сейчас делать много ненужного. Но я не собираюсь поразить воображение пользователей необычным дизайном программы, по причине чего не хочу пока разбираться с этим вопросом. В памяти осталось, что Qt Designer использует понятие слотов. В моем представлении, слот - нечто вроде гнезда, в которое вставляется модуль, как в материнскую плату вставляется модуль памяти. Используется и понятие сигналов, что для меня равносильно понятию использования выводов разъема. Через его выводы модуль получает сигналы от материнской платы или сам передает сигналы материнской плате.
И, действительно, открыв в KDevelop файлы bookwidgetxpp и bookwidget. h, в последней находим слот:
Public slots:
/* $ PUBLIC_SLOTS$ */
Virtual void button_clicked();
А в первой находим сигнал, относящийся к этому слоту:
Void bookWidget::button_clicked() {
If ( label->text().isEmpty() ) {
Label->setText( - Hello World!" );
}
Else {
Label->clear();
} }
Этим для начала я и воспользуюсь, хотя, подозреваю, есть более простые способы реализовать то, что мне надо. В первую очередь я хочу переименовать кнопку из button в port_open. Я делаю это на вкладке bookwidgetbase. ui. В Object Explorer выбираю button, а в Property Editor в графе name меняю имя с button на port__open. Щелчком правой кнопки мыши открываю меню, выбираю Слоты, где меняю имя слота. Повторяю это, выбирая Соединения, где в разделе слот указываю новое имя. Затем меняю, чтобы не путаться в файлах. срр и. h имя:
Void bookWidget::port_open_clicked() virtual void port_open_clicked();
Сохраняю эти файлы. Пытаюсь сохранить файл bookwidgetbase. ui, но он не хочет сохраняться. Тогда в выпадающем меню формы выбираю Разорвать расположение, сохраняю файл и повторяю Lay Out in a Grid, сохраняя файл.
В итоге проект собирается и запускается. В редакторе интерфейса я добавляю кнопки, которые называю port_close и ButtonGroup (и то, и другое из меню Common Widgets слева). Текст группы кнопок я меняю на Гостиная (двойной щелчок текста на форме открывает редактор текста). Пока не забыл, я вношу добавления в файлы bookwidget. cpp:
Void bookWidget: :port_close_clicked() {};
И bookwidget. h:
Virtual void port_close_clicked();
Затем открываю в редакторе интерфейса раздел Слоты и добавляю новый слот с помощью кнопки Добавить функцию:
Рогt_c1osе_сlicked()
Отказываюсь генерировать новый класс. Добавляю новое соединение с помощью раздела Соединения и кнопки Новое, щелкая левой кнопкой мыши ячейки таблицы:
Sender - port_close Сигнал - clicked() Receiver - bookwidgetbase Слот - port_close_clicked()
И все сохраняю.
Для завершения этого этапа работы я добавляю еще две кнопки Свет включить, Свет выключить и из раздела инструментального меню Display этикетку PixmapLabel. Их я пока не оформляю. С PixmapLabel история простая - я попытался сделать включение и выключение ламп, как это делал в Visual Basic, но не получилось. Я не стал на этом «зацикливаться» и решил обойти проблему. В графическом редакторе KolourPaint я делаю полоску 850x80, которую закрашиваю в желтый цвет, а картинку сохраняю как light (рисунок Portable Pixmap) в папке проекта. Теперь картинку по умолчанию я поменяю на свой рисунок, который и будет изображать включенный свет (рис. П.15).
Под кнопкой Свет выключить на основной форме я расположил еще одну TextLabel, которую назвал answer. Ее я предполагаю использовать для получения ответа от релейного модуля для запроса статуса реле.
Вот, собственно, что я предполагал сделать в графическом плане. И хотя по дороге я несколько раз наступал на грабли, это были еще не «те» грабли.
С самого начала меня беспокоила и продолжает беспокоить сейчас возможность работы с СОМ-портом. Среда программирования в явном виде не предоставляет мне такой возможности, как это было в Visual Basic. Первое, что приходит в голову, - поискать в Интернете. И не напрасно. Я нахожу пакет qextserialport -0.9.0, автор которого:
І Правка Вид Dpoerr Сборка Отдадка Сценарии £асположаниа Qkmo Сдоис Цастоойка Ставка ~ ЩДЗО Q <S її т т Ш Л Н I щ: и Рис. П. 15. Изображение включенного света в программе |
class Posix_QextSerialPort version 0.-70 (pre-alpha) author Wayne Roth
Предлагает исходные тексты классов объектов для кросс- платформенного применения при работе с последовательным портом.
С объектами разных классов мы, в сущности, уже работали, когда создавали интерфейс. Почитав у Липпмана то, что относится к классовой сущности языка С++, я в какой - то мере осознал, что класс - это классно. Но как применить наверняка очень полезное и грамотное творение Вэйна Рота к моей простенькой программе, я понять не могу. Однако почти уверен, что есть разные пути и способы, и почти уверен, что я их не знаю. Для начала я просто создаю собственный класс, который добавляю в программу. Поскольку этот механизм работает, я, не мудрствуя лукаво, добавляю в программу исходные тексты программы, написанные Вэй - ном Ротом. Для моих целей хватает posix_qextserialport и qextserialbase. Я добавляю в проект и файлы заголовков, и основные файлы.
Второй, быть может не менее важный для меня момент осознания, - куда и что добавлять? Я понимаю, что следует записать:
#include <posix_qextserialport. h> #include <qextserialbase. h>
Но куда? И опять я, не мудрствуя лукаво, добавляю эти записи в файл, где происходят все события моей программы, - bookwidget. cpp и его файл заголовка. Не знаю, насколько это правильно, но это срабатывает. Программа транслируется без ошибок, проект собирается. Кстати, проект, который я собирал, я назвал так же, как в Visual Basic - barby (по имени богатой куклы - Barbie).
К этому проекту и обратимся в дальнейшем. Его графический интерфейс выглядит практически так же, как выше приведенный. Файл barbywidget. cpp (аналогично файлу bookwidgetxpp) выглядит следующим образом.