Самарев Р.С. - Программирование с использованием библиотеки Qt, страница 2
Описание файла
PDF-файл из архива "Самарев Р.С. - Программирование с использованием библиотеки Qt", который расположен в категории "". Всё это находится в предмете "языки интернет-программирования" из 5 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "языки интернет-программирования" в общих файлах.
Просмотр PDF-файла онлайн
Текст 2 страницы из PDF
MOC обрабатывает исходный текст программы,подставляя вместо специфических конструкций реализацию заказанных свойств на С++.Соответственно на выходе MOC получается исходный код С++.Компиляция и сборка программы осуществляется компилятором C++ и компоновщиком, доступными в рамках платформы, где осуществляется сборка (см. рисунок 1).#include<имя>_moc.cpp<имя>.h(Q_OBJECT,slots, signals)moc(Meta ObjectCompiler)реализациявспомогательныхметодов Qt<имя>.cpp(реализацияформы классамиQt )C++ компилятор<имя>[.exe]КомпоновшикИсполняемаяпрограммаРисунок 1 – Схема сборки приложения, реализованного вручнуюК таким средствам в частности относятся сигналы и слоты, поддержка которых дляконкретного диалога также генерируется автоматически в коде отдельной программыC++.1.1 Сигналы и слотыКлючевым механизмом взаимодействия объектов в Qt являются сигналы и слоты.Каждый объект, интегрированный в систему управления Qt, т.е.
описанный какQ_OBJECT, может иметь типизированные слоты, обеспечивающие прием и обработку типизированных сигналов от других объектов, и собственные сигналы, прием которых мо-Оглавление7гут осуществлять другие объекты. Связь между сигналами и слотами конкретных объектов устанавливается посредством функции connect(…) (см. рисунок 2).Декларация сигналов и слотов осуществляется в теле класса с помощью ключевыхслов signals и slots, воспринимаемых компилятором moc. Если необходимо предотвратитьиспользование указанных ключевых слов, встречающихся в других библиотеках, то вместо них используют ключевые слова Q_SIGNALS, Q_SLOTS.По правилам Qt один слот может принимать несколько сигналов, а один сигналтранслироваться на несколько слотов.
Причем во взаимодействии участвуют не классы, аконкретные объекты, поэтому схема передачи сигналов к слотам может быть в любой момент динамически изменена.Object1connect(Object1, signal1, Object2, slot1)connect(Object1, signal1, Object2, slot2)signal1signal2Object2signal1slot1slot2Object3Object4signal1connect(Object1, signal1,Object4, slot1)slot1connect(Object3, signal1, Object4, slot3)slot1slot2slot3Рисунок 2 – Схема связывания сигналов и слотов объектовСледует отметить, что механизм слотов не исключает возможности использованиясредств наследования и полиморфизма языка C++, так что любой класс Qt может бытьпереопределен.1.2Использование QtDesignerПри необходимости быстрого получения результата, проведения экспериментов поразмещению объектов, общей оценки интерфейса возможно использование специальногоредактора интерфейсов QtDesigner.
QtDesigner не накладывает никаких ограничений насредства разработки, поскольку интерфейс, созданный им, в конечном счете будет преобразован компилятором uic в код программы на языке C++, обеспечивающий созданиеименно этого интерфейса (см. рисунок 3).Оглавление8#includeФорма<имя>Qt Designer<имя>.hдекларациякласса потомкаQWidget<имя>.uiреализациявспомогательныхметодов Qt<имя>.cppреализацияметодов классаXML-описаниеформыuic(User interfacecompiler)<имя>_moc.cppmoc(Meta ObjectCompiler)#includeC++ компиляторui_<имя>.h<имя>[.exe]реализацияконструктораформы setupUiКомпоновшикИсполняемаяпрограммаРисунок 3 – Схема сборки приложения с формами, сделанными в QtDesignerЭто позволяет также использовать QtDesigner для обучения принципам программирования Qt и размещения элементов в форме, т.к.
результирующий код является доступным и использует те же классы Qt, которые необходимы при ручной разработке.При использовании QtDesigner описание поведения, т.е. слотов, осуществляетсяпрограммистом в отдельном файле. В Qt3.x такой файл имеет суффикс .ui.h, а в Qt4.x – .h.Сформированный QtDesigner файл .ui представляет собой XML-описание диалога.По созданному .ui – описанию user interface compiler (uic) генерирует код программы наязыке C++, где создание диалога осуществляется классами Qt. В Qt3.x формируется класспотомок QWidget, в Qt4.x формируется самостоятельный код, обеспечивающий созданиеформы по вызову метода setupUi().Диалоги, созданные в QtDesigner также могут подключаться в программу динамически посредством класса QFormBuilder или QWidgetFactory::create("form.ui") в Qt3.x безнеобходимости генерации и компиляции кода их создания на С++.1.3Система документацииБиблиотека Qt снабжена системой документации QtAssistant, реализованной единообразно для всех платформ, на которых возможна разработка с использованием этой библиотеки.
Внешний вид приложения QtAssistant представлен на рисунке 4.Оглавление9Рисунок 4 – Справочная документация – приложение QtAssistantДля ОС Windows исполняемый файл системы документации имеет имяassistant.exe, по которому его можно запустить из консоли «Qt Command Prompt».QtAssistant предоставляет возможность навигации по разделам, по индексному указателю, а также нахождения необходимой фразы, в том числе включающей имена классови/или методов, по контексту во всех статьях документации. Документация предоставляетнесколько вариантов группировки классов и функций библиотеки, что позволяет быстронайти классы для работы, например с сигналами и слотами, с графикой, классы контейнеры и пр.Поскольку Qt поставляется в виде исходных тестов, в качестве примеров разработки могут быть использованы как эти исходные тексты, так и многочисленные примеры, входящие в комплект поставки Qt.
Исходные тексты располагаются в директории…\Qt\4.x.x\src.Примерырасполагаютсявдиректориях…\Qt\4.x.x\examplesи…\Qt\4.x.x\demos. В комплекте Qt SDK префикс имени директории …\Qt\4.x.x меняется на…\Qt\20xx.xx\qt\..Документацию на русском языке можно взять на сайте http://doc.crossplatform.ru/qt/Оглавление102 Создание простого приложенияНа рисунке 5 показан внешний вид простого приложения, в котором предлагаетсяввести возраст с использованием одного из трех вариантов ввода:1) непосредственного ввода числа,2) посредством стрелок (элемент типа QSpinBox), последовательно увеличивающих или уменьшающих значение,3) с помощью специального ползунка (слайдера – элемент типа QSlider).Кроме того, задано верхнее ограничение вводимого возраста, что должно быть корректно отработано слайдером в крайних положениях, а изменение значения любым способом должно синхронизировать его положение.Рисунок 5 – Внешний вид приложения ex12.1Создание исходного кода проектаСоздадим директорию ex1, в которую запишем файл ex1.cpp, содержащий следующий код.
Для этого можно воспользоваться любым текстовым редактором, напримерБлокнот или Notepad.#include <QApplication>#include <QHBoxLayout>#include <QVBoxLayout>#include <QSlider>#include <QSpinBox>#include <QPushButton>#include <QTextCodec>// Преобразуем входную последовательность символов в кодировку UNICODE#define RUS( str ) codec->toUnicode(str)int main(int argc, char *argv[]){QApplication app(argc, argv);// Обеспечиваем перекодировку русских букв из кодировки,// в которой написана программа.// "Windows-1251" - для Windows, "KOI8-R" - Linux и т.д.QTextCodec * codec = QTextCodec::codecForName("Windows-1251");Оглавление11// Создаем главное окноQWidget *hbox = new QWidget();hbox->setWindowTitle( RUS("Введите Ваш Возраст") );QSpinBox *spinBox = new QSpinBox( hbox );QSlider *slider = new QSlider(Qt::Horizontal, hbox );spinBox->setRange(0, 130);slider->setRange(0, 130);spinBox->setValue(35);QPushButton * btn = new QPushButton( RUS("Завершение"), hbox );//***************************************************************************QHBoxLayout *layout = new QHBoxLayout; // выравнивание по горизонтали//QVBoxLayout *layout = new QVBoxLayout; // выравнивание по вертикалиlayout->setContentsMargins(5,5,5,5);// устанавливаем внешние границыlayout->setSpacing(5); // устанавливаем интервал элементов внутриhbox->setLayout(layout);// связываем layout с hbox// устанавливаем порядок следования элементовlayout->addWidget(spinBox);layout->addWidget(slider);layout->addWidget(btn);//***************************************************************************// связываем сигнал изменения spinBox со слотом sliderQObject::connect(spinBox, SIGNAL(valueChanged(int)),slider, SLOT(setValue(int)));// связываем сигнал изменения slider со слотом spinBoxQObject::connect(slider, SIGNAL(valueChanged(int)),spinBox, SLOT(setValue(int)));// связываем сигнал нажатия btn со слотом close главного окнаQObject::connect(btn, SIGNAL(clicked(bool)),hbox, SLOT(close()));hbox->show();// отображаем окноreturn app.exec();// запускаем цикл обработки сообщений}В приведенной программе объект типа QApplication обеспечивает управление всеми ресурсами приложения, а также обработку событий, поступающих от операционнойсистемы.Оглавление12По терминологии UNIX и Qt, визуальные объекты – элементы графического интерфейса пользователя называются виджетами (widget – window gadget) и являются потомками класса QWidget.
Любой из них может стать главным окном или быть использовандругим виджетом, выполняющим роль контейнера. В представленном выше примере виджет hbox назначается главным окном, а его отображение обеспечивается вызовом функции hbox->show(). В главном окне (виджете) размещено три подчиненных виджета –объекты spinBox и slider типов QSpinBox и QSlider, а также btn типа QPushButton(кнопка). Для каждого виджета может быть выбрана одна схема размещения подчиненныхвиджетов (Layout). В частности для hbox используем схему горизонтального выравнивания QHBoxLayout * layout.