WWW.DISS.SELUK.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА
(Авторефераты, диссертации, методички, учебные программы, монографии)

 

Оглавление

Аннотация

Введение

1 Основные принципы работы с библиотекой Qt

1.1 Сигналы и слоты

1.2 Использование QtDesigner

1.3 Система документации

2 Создание простого приложения

2.1 Создание исходного кода проекта

2.2 Компиляция и компоновка проекта

2.3 Задание

3 Создание простого приложения в QtDesigner

3.1 Визуальное проектирование формы приложения

3.2 Описание реакций на сигналы

3.3 Сборка приложения

3.4 Задание

4 Разработка калькулятора

4.1 Исходные данные

4.2 Задание

5 Простейшие элементы ввода-вывода

5.1 Некоторые средства для ввода и вывода текста

5.2 Задание

Требования к отчету

Контрольные вопросы

Литература

Приложение A. Средство управления сборкой QMake

Приложение Б. Основные классы Qt

Основные группы классов

Классы контейнеры

Приложение В. Порядок установки Qt в ОС MS Windows

МГТУ им. Н.Э. Баумана Факультет «Информатика и Системы Управления»

Кафедра ИУ-6 «Компьютерные системы и сети»

Самарев Роман Станиславович Программирование с использованием библиотеки Qt Учебное пособие к лабораторным работам по курсу Алгоритмические языки и программирование

МОСКВА

2009 год МГТУ им. Баумана Оглавление Аннотация Учебное пособие предназначено для студентов, слушающих курс Алгоритмические языки и программирование. В работе рассмотрены основные принципы построения приложений, имеющих графический интерфейс пользователя с использованием кроссплатформенной библиотеки Qt. Рассмотрены принципы разработки графического интерфейса как с использованием так и без использования средства прототипирования QtDesigner.

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

Оглавление Введение Qt (произносится как «кьют») – кросс-платформенный инструментарий для разработки программного обеспечения. Этот инструментарий создан компанией Trolltech и в данный момент принадлежит компании Nokia. Qt – это совокупность кросс-платформенной библиотеки классов, реализованной на языке C++, и ряда дополнительных инструментальных средств, включающих Meta Object Compiler (MOC) – объектный предкомпилятор, User Interface Compiler (UIC) – компилятор пользовательских интерфейсов, qmake – средство управления сборкой проектов.

Поддерживаются операционные системы MS Windows, Linux, MacOS, а также встраиваемые операционные системы Embedded Linux, Windows CE, Symbian. Наиболее известными примерами разработки на Qt являются: программа-коммуникатор Skype, медииа-плеер VLC, Google Earth (см. http://qt.nokia.com/qt-in-use ), графический интерфейс пользователя KDE, применяемый в ОС Linux. На сайте http://www.qt-apps.org/ приводится база OpenSource проектов, использующих Qt.

В состав Qt входят следующие группы классов:

- классы, обеспечивающие разработку оконного графического интерфейса пользователя, включая все основные управляющие примитивы;

- классы, реализующие работу с потоками, объектами синхронизации процессов/потоков;

- классы для работы с 2-х и 3-х мерной графикой, классы реализующие поддержку некоторых графических форматов хранения;

- реализация динамических массивов в виде шаблонов C++;

- классы для работы с XML;

- и пр.

В настоящее время существует две не полностью совместимые ветви версий Qt – 3.х и 4.х. При этом ветвь 3.х сохраняется для поддержки старых программ, а разработка новых рекомендована с использованием 4.х. Кроме того, существуют OpenSource версии для разработки программ, не предназначенных для коммерческого использования (доступны на сайте http://qt.nokia.com), и коммерческие версии для разработки программ без ограничения целевого назначения.

Qt 3.x и 4.x поставляются в составе современных Linux-дистрибутивов, обеспечивая возможность разработки в интегрированных средах KDevelop, Eclipse и пр. Для ОС Windows имеются средства, позволяющие интегрировать Qt в среду разработки: uic, moc – Оглавление компиляторы и QtDesigner. При этом возможна интеграция Qt 3.x в MS Visual Studio и Qt 4.x — в MS Visual Studio 2003/2005/2008. OpenSource Qt 4.x для Windows может быть интегрирована в IDE Eclipse с подключенным компилятором mingw-gcc, а также использоваться совместно с кроссплатформенной IDE QtCreator. Библиотеки для использования могут быть откомпилированы любым компилятором C++, имеющимся в ОС, например для Windows - MS Visual С++, Borland C++, mingw-gcc.

В библиотеке реализовано автоматическое удаление объектов, являющихся элементами графического интерфейса пользователя. Механизм реализован следующим образом:

любой подобный объект Qt является потомком QObject, в состав которого входят средства хранения и позиционирования списка потомков, т.е. объектов, при создании которых этот объект указан как parent. Следовательно, при удалении корневого объекта возможно удаление всего дерева объектов-потомков.

При использовании Qt совершенно естественным является переопределение классов Qt средствами C++, что существенно упрощает код в приложениях, требующих однотипной реализации нестандартных элементов, например создание класса кнопки виртуальной клавиатуры с изменяемой надписью/рисунком на основе стандартного класса QButton.

В Qt может быть использовано кросс-платформенное средство управления сборкой проектов qmake, посредством которого из.pro-файлов генерируются файлы makefile для конкретной платформы с конкретными компиляторами и компоновщиками. Более подробно см. приложение А.

Формы с использованием классов Qt могут создаваться вручную или с использованием специального пакета QtDesigner. При создании форм вручную программист кодирует текст программы, включая по мере необходимости вызовы объектов классов Qt. При использовании QtDesigner программист графически компонует внешний вид и связи сигналов и слотов формы, а компилятор интерфейса UIC формирует из полученного описания формы код на языке C++, обеспечивающий создание этой формы.

Qt расширяет синтаксис описания классов C++ специальными средствами, обработка которых возложена на MOC. MOC обрабатывает исходный текст программы, подставляя вместо специфических конструкций реализацию заказанных свойств на С++.

Соответственно на выходе MOC получается исходный код С++.

Компиляция и сборка программы осуществляется компилятором C++ и компоновщиком, доступными в рамках платформы, где осуществляется сборка (см. рисунок 1).

Рисунок 1 – Схема сборки приложения, реализованного вручную К таким средствам в частности относятся сигналы и слоты, поддержка которых для конкретного диалога также генерируется автоматически в коде отдельной программы C++.

Ключевым механизмом взаимодействия объектов в Qt являются сигналы и слоты.

Каждый объект, интегрированный в систему управления Qt, т.е. описанный как Q_OBJECT, может иметь типизированные слоты, обеспечивающие прием и обработку типизированных сигналов от других объектов, и собственные сигналы, прием которых моОглавление гут осуществлять другие объекты. Связь между сигналами и слотами конкретных объектов устанавливается посредством функции connect(…) (см. рисунок 2).

Декларация сигналов и слотов осуществляется в теле класса с помощью ключевых слов signals и slots, воспринимаемых компилятором moc. Если необходимо предотвратить использование указанных ключевых слов, встречающихся в других библиотеках, то вместо них используют ключевые слова Q_SIGNALS, Q_SLOTS.

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

Следует отметить, что механизм слотов не исключает возможности использования средств наследования и полиморфизма языка C++, так что любой класс Qt может быть переопределен.

При необходимости быстрого получения результата, проведения экспериментов по размещению объектов, общей оценки интерфейса возможно использование специального редактора интерфейсов QtDesigner. QtDesigner не накладывает никаких ограничений на средства разработки, поскольку интерфейс, созданный им, в конечном счете будет преобразован компилятором uic в код программы на языке C++, обеспечивающий создание именно этого интерфейса (см. рисунок 3).

Рисунок 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 без необходимости генерации и компиляции кода их создания на С++.

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

Рисунок 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/ На рисунке 5 показан внешний вид простого приложения, в котором предлагается ввести возраст с использованием одного из трех вариантов ввода:

1) непосредственного ввода числа, 2) посредством стрелок (элемент типа QSpinBox), последовательно увеличивающих или уменьшающих значение, 3) с помощью специального ползунка (слайдера – элемент типа QSlider).

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

Создадим директорию ex1, в которую запишем файл ex1.cpp, содержащий следующий код. Для этого можно воспользоваться любым текстовым редактором, например Блокнот или Notepad.

#include #include #include #include #include #include #include // Преобразуем входную последовательность символов в кодировку 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");

// Создаем главное окно 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 со слотом slider QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));

// связываем сигнал изменения slider со слотом spinBox QObject::connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));

// связываем сигнал нажатия btn со слотом close главного окна QObject::connect(btn, SIGNAL(clicked(bool)), hbox, SLOT(close()));

return app.exec(); // запускаем цикл обработки сообщений В приведенной программе объект типа QApplication обеспечивает управление всеми ресурсами приложения, а также обработку событий, поступающих от операционной системы.

По терминологии UNIX и Qt, визуальные объекты – элементы графического интерфейса пользователя называются виджетами (widget – window gadget) и являются потомками класса QWidget. Любой из них может стать главным окном или быть использован другим виджетом, выполняющим роль контейнера. В представленном выше примере виджет hbox назначается главным окном, а его отображение обеспечивается вызовом функции hbox->show(). В главном окне (виджете) размещено три подчиненных виджета – объекты spinBox и slider типов QSpinBox и QSlider, а также btn типа QPushButton (кнопка). Для каждого виджета может быть выбрана одна схема размещения подчиненных виджетов (Layout). В частности для hbox используем схему горизонтального выравнивания QHBoxLayout * layout. Связывание главного виджета со схемой размещения выполняется вызовом hbox->setLayout(layout). Подчиненные виджеты будут отображены в порядке их добавления (вызовы layout->addWidget).

Следующие вызовы обеспечат связывание сигналов valueChanged() объектов spinBox, slider таким образом, чтобы изменение любого из них приводило к изменению другого.

QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));

QObject::connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));

Связывание сигнала clicked() объекта btn со слотом close() главного окна приведет к тому, что по нажатию на эту кнопку, окно hbox будет закрыто.

QObject::connect(btn, SIGNAL(clicked(bool)), hbox, SLOT(close()));

После того, как cpp-файл с текстом программы создан, необходимо создать qmakeпроект для её сборки. Для использования средств разработки, необходимо, чтобы переменные среды окружения, указывающие местоположение и тип компилятора, который будет использован при сборке Qt-проектов, были правильно определены. Во избежание проблем при наличии нескольких сред разработки на одном компьютере в состав Qt входит пакетный файл …\Qt\4.x.x\bin\qtvars.bat, определяющий правильные значения переменных окружения. При использовании комплекта Qt SDK директория библиотека будет размещена в директории …\Qt\20xx.xx\qt\, а пакетный файл, определяющий системные переменные будет называться …\Qt\20xx.xx\bin\qtenv.bat.

В данной лабораторной работе с использованием ОС MS Windows работу с проектом будем осуществлять в консольном режиме. Для перехода в этот режим выбираем меню Пуск/Qt by Nokia v4.6.0 (VS2008 OpenSource)/Qt Command Prompt или Пуск/Qt SDK by Nokia v2009.05 (open source)/ Qt Command Prompt.

Затем устанавливаем текущей ту директорию, в которой находится cpp-файл программы. Для этого используем команду изменения директории cd Имя_директории.

Для создания файла-проекта, включающего файлы текущей директории, воспользуемся специальной командой qmake -project.

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

Файл отредактируем следующим образом:

CONFIG += release # имя поддиректории для исполняемого файла SOURCES = ex1.cpp # имя исходного файла программы Запускаем qmake ex1.pro, который на базе файла ex1.pro сформирует файл Makefile, определяющий фактический порядок сборки программы, положение компилятора и необходимых библиотек.

После того, как в текущей директории появился файл Makefile, вводим команду nmake (mingw32-make или make в зависимости от компилятора и при их наличии в текущей версии Qt).

Результат сборки программы – файл ex1.exe.

В процессе работы ex1.exe могут потребоваться динамические библиотеки QtCore4.dll и QtGui4.dll, которые должны находиться в путях автовызова, устанавливаемых системной переменной Path, или быть скопированы в директорию запуска приложения ex1.exe.

Замените в программе схему выравнивания QHBoxLayout на QVBoxLayout и зафиксируйте результат.

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

В MS Windows исполняемый файл QtDesigner называется designer.exe и может быть запущен из консоли «Qt Command Prompt» по своему имени designer или через меню Пуск/Qt SDK by Nokia v.../Tools/Qt Designer. Qt Designer входит в любой комплект Qt, однако в комплекте Qt SDK может не иметь ярлыка, доступного из меню «Пуск», так как его функции в Qt SDK дублирует QtCreator. В этом случае можно непосредственно запустить программу c:\Qt\xx\qt\bin\designer.exe.

3.1 Визуальное проектирование формы приложения После запуска QtDesigner появится окно, показанное на рисунке 6. В качестве примера приложения создадим диалог без кнопок по шаблону «Dialog without Buttons».

После выбора шаблона появится форма, показанная на рисунке 7. Изменим название диалога посредством редактирования свойства objectName=DialogEx2 в правой колонОглавление ке QtDesigner. Далее необходимо сохранить форму на диске. Для этого выберите команду меню File/Save и в директории, в которой будет находиться программа, сохраните форму под именем ex2.ui.

Разместим на форме элементы так, как показано на рисунке 8. Для того, чтобы поместить конкретный элемент из левой колонки, необходимо «перетащить» его мышью на форму. На этом этапе не следует стремиться ровно размещать элементы.

QtDesigner включает средство проверки полученного результата. Строго говоря, подобное средство есть и у программиста, что позволяет в своей программе динамически загружать формы, созданные в QtDesigner, однако данный пример иллюстрирует статическое подключение формы. Режим просмотра Preview может быть активирован нажатием комбинации клавиш Ctrl+R (см. рисунок 9), а также через меню Form/Preview или Form/Preview in/…style.

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

Ясно, что в реальной программе это недопустимо. Воспользуемся так называемым менеджером компоновки (который использует средства выравнивания, рассмотренные в первом задании – классы с суффиксами Layout). Выделите пару элементов QSpinBox и QDial, после чего нажмите кнопку вертикального выравнивания элементов. Далее выделите пару элементов QLabel – QPushButton и нажмите кнопку горизонтального выравнивания. Для элемента QTextEdit образуем пару с ранее скомпонованными QSpinBox-QDial, используя кнопку горизонтального выравнивания. В заключение, для всей формы (при этом не выделен ни один элемент) определяем вертикальное выравнивание элементов.

Рисунок 10 – Добавление схемы выравнивания в форму ex В итоге должны получить форму, похожую на рисунок 11.

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

Изменим форму таким образом, чтобы надпись всегда находилась рядом с кнопкой, а элемент QSpinBox не был прижат к ней. Для этого необходимо перетащить элементы, изображенные пружинами, называемые Horizontal Spacer и Vertical Spacer, соответственно. Перед их размещением на форме необходимо разрушить компоновку, нажав комбинацию клавиш Ctrl-0 (Break Layout) и провести компоновку так, как показано на рисунке 13.

Проверяем результат в режиме просмотра. На рисунке 14 показан примерный вид формы при изменении её линейных размеров.

Рисунок 14 – Изменение размеров формы ex2 в окончательном варианте Следующим шагом является добавление реакций на действия. QtDesigner имеет четыре режима работы с формой:

- редактирование виджетов (Edit Widgets – клавиша F3), в котором производится размещение и компоновка элементов;

- редактирование сигналов и слотов (Edit Signals/Slots – клавиша F4), при котором производится визуальное связывание элементов, формирующих сигналы и элементов, получающих сигналы;

- редактирование «дружеских отношений» (Edit Buddies), где производится визуальное связывание меток QLabel, в которых одна из букв отмечена знаком & с элементами, способными принимать фокус ввода от клавиатуры. Например, метка с текстом «&Save» обозначает, что при нажатии комбинации Alt-S фокус ввода будет установлен на тот элемент, который связан с этой меткой;

- редактирование порядка следования элементов при использовании клавиши Tab Переключим QtDesigner в режим сигналов и слотов и обеспечим связывание элементов. Для того чтобы установить связь, необходимо нажать левой клавишей мыши на элемент источник, после чего не отпуская переместить появившуюся стрелку на элементполучатель. В открывшемся окне выбрать пару сигнал и соответствующий ему слот.

Определим следующие пары:

dial, SIGNAL(sliderMoved(int)) – spinBox, SLOT(setValue(int)) spinBox, SIGNAL(valueChanged(int)) – dial, SLOT(setValue(int)) btnExit, SIGNAL(clicked()) – DialogEx2, SLOT(reject()) spinBox, SIGNAL(valueChanged(QString)) – textEdit, SLOT(append(QString)) Результат, который должен получиться, показан на рисунке 15.

Рисунок 15 – Связывание сигналов и слотов элементов формы ex2 в QtDesigner Проводим проверку формы в режиме просмотра. При изменении величины в QSpinBox должно синхронно меняться положение в QDial и наоборот. Кроме того, все мгновенные значения регистрируются в элементе QTextEdit. На рисунке 16 демонстрируется результат, который должен быть получен, если все сделано правильно. Полученную форму сохраняем в файл под именем ex2.ui.

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

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

#ifndef DIALOG_EX2_H #define DIALOG_EX2_H #include #include "ui_ex2.h" // заголовок сгенерированный uic автоматически class DialogEx2 : public QDialog, public Ui::DialogEx Q_OBJECT public:

DialogEx2( QWidget * parent = 0);

private slots:

void onExitClicked();

#endif Определяем класс DialogEx2 потомком классов QDialog (стандартный диалог) и сформированный автоматически компилятором uic по созданной форме класс Ui::DialogEx2, в котором описана последовательность создания формы. Его реализацию можно увидеть в файле ui_ex2.h, который появится после работы uic. Определим слот, который будет обеспечивать реакцию на нажатие кнопки – onExitClicked(). Имя слота может быть выбрано произвольно.

Описываем реализацию класса DialogEx2 в файле dialogex2.cpp:

#include #include // Преобразуем входную последовательность символов в кодировку UNICODE #define RUS( str ) codec->toUnicode(str) DialogEx2::DialogEx2(QWidget * parent) :QDialog(parent) setupUi(this); // Строим форму, описанную в Ui_DialogEx // связываем сигнал кнопки со слотом onExitClicked connect(pushButton, SIGNAL(clicked()), this, SLOT(onExitClicked()));

void DialogEx2::onExitClicked() QTextCodec * codec = QTextCodec::codecForName("Windows-1251");

// Спрашиваем, закрывать приложение или нет if( QMessageBox::question ( this, QString(), RUS("Завершить приложение?"), QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes ) Примечание - В тексте программы используется имя кнопки btnExit к, В отдельном файле реализуем создание объекта приложения и отображение формы. Файл ex2.cpp содержит следующий код:

#include "dialogex2.h" int main(int argc, char *argv[]) QApplication app(argc, argv);

1) //Отображаем форму так, как сделано в QtDesigner DialogEx2 * dialog1 = new DialogEx2();

2) // Отображаем две формы горизонтально с вертикальным разделителем QSplitter * splitter = new QSplitter(Qt::Horizontal);

DialogEx2 * dialog1 = new DialogEx2();

DialogEx2 * dialog2 = new DialogEx2();

splitter->addWidget( dialog1 );

splitter->addWidget( dialog2 );

return app.exec(); // запускаем цикл обработки сообщений Обратите внимание, что в функции присутствуют два взаимно исключающих блока создания диалога DialogEx2. Первый вариант – очевиден и приведет к появлению формы в таком виде, как она была создана в QtDesigner. Второй вариант иллюстрирует возможность использования формы в качестве подчиненного элемента для другого виджета. В частности, QSplitter – виджет, обеспечивающий разделение двух других виджетов, причем граница между ними может быть перемещена пользователем с помощью мыши. Представленный выше фрагмент кода реализует в качестве виджетов и использует две формы типа DialogEx2 (см. рисунок 17).

Рисунок 17 – Приложение ex2 с двумя формами с разделителем Для того чтобы собрать приложение, необходим файл проекта ex2.pro, который может быть сформирован автоматически командой qmake –project или быть таким как представлено ниже:

CONFIG += release HEADERS += dialogex2.h SOURCES += dialogex2.cpp ex2.cpp Окончательная сборка проекта производится командами qmake ex2.pro и nmake.

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

Измените тип разделителя с QSplitter(Qt::Horizontal); на QSplitter(Qt::Vertical); и зафиксируйте полученный результат.

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

Форму приложения реализуем на основе класса Qdialog. При этом воспользуемся классом QSignalMapper, позволяющим в данном случае унифицировать процесс обработки нажатий кнопок, направив сигналы от всех кнопок на единственный слот void clicked(int id), параметром которого будет идентификатор кнопки. Число будем отображать в элементе m_pLineEdit, имеющим тип QLineEdit*.

Заголовочный файл calcDialog.h с описанием класса CalcDialog представлен ниже:

#ifndef _CALC_DIALOG_H_ #define _CALC_DIALOG_H_ #include #include #include /// Класс, реализующий калькулятор class CalcDialog: public QDialog Q_OBJECT public:

CalcDialog( QWidget * parent = 0);

virtual ~CalcDialog(){};

protected:

QSignalMapper * m_pSignalMapper;

QLineEdit * m_pLineEdit;

double m_Val; ///< Значение, с которым будет выполнена операция int m_Op; ///< Код нажатой операции bool m_bPerf;///< Операция была выполнена. Надо очистить поле ввода void initNum();///< Инициализировать переменные, связанные с вычислениями double getNumEdit(); ///< Получить число из m_pLineEdit void setNumEdit( double ); ///< Отобразить число в m_pLineEdit /// Вычислить предыдущую операцию ///(в бинарных операциях был введен второй операнд) void calcPrevOp( int curOp );

/// Проверить, была ли выполнена операция при нажатии на цифровую клавишу /// Если операция выполнена, значит m_pLineEdit необходимо очистить void checkOpPerf();

private slots:

/// Слот для обработки нажатий всех кнопок void clicked(int id);

#endif При создании кнопок необходимо обеспечить их правильное размещение. Воспользуемся средствами Qt и создадим схемы размещения виджетов в соответствии с рисунком 19.

Таблица 1 – Назначение схем выравнивания gridLayout QGridLayout Цифровые кнопки и кнопки операций bccKeysLayout QHBoxLayout Кнопки удаления последней цифры, сброс текущего значения и сброс операции mainKeysLayout QHBoxLayout Цифровые кнопки + кнопка выполнения «=»

dlgLayout QVBoxLayout Вертикальное размещение элемента QLineEdit Реализуем основную программу – файл calcDialog.cpp. Ниже приведен текст программы, снабженный комментариями.

#include #include #include #include #include #include ”calcDialog.h” // Идентификаторы кнопок // Для цифровых кнопок идентификатор является соответствующая цифра #define DIV #define MUL #define MINUS #define PLUS #define INVERSE #define DOT #define BKSP #define CLR #define CLR_ALL // количество кнопок в группе, отображаемой в виде сетки #define GRID_KEYS /// Описатель кнопки struct BtnDescr{ QString text; ///< Отображаемый на кнопке текст int id; ///< Идентификатор кнопки BtnDescr() { id=0;}; ///< Конструктор по умолчанию ///< Конструктор для инициализации BtnDescr( const QString & str, int i) /// Динамический массив-вектор элементов описателей кнопок QVector _btnDescr;

/// Инициализация массива _btnDescr всеми отображаемыми кнопками void InitBtnDescrArray() _btnDescr.push_back( BtnDescr("7", 7) );

_btnDescr.push_back( BtnDescr("8", 8) );

_btnDescr.push_back( BtnDescr("9", 9) );

_btnDescr.push_back( BtnDescr("/", DIV) );

_btnDescr.push_back( BtnDescr("4", 4) );

_btnDescr.push_back( BtnDescr("5", 5) );

_btnDescr.push_back( BtnDescr("6", 6) );

_btnDescr.push_back( BtnDescr("*", MUL) );

_btnDescr.push_back( BtnDescr("1", 1) );

_btnDescr.push_back( BtnDescr("2", 2) );

_btnDescr.push_back( BtnDescr("3", 3) );

_btnDescr.push_back( BtnDescr("-", MINUS) );

_btnDescr.push_back( BtnDescr("0", 0) );

_btnDescr.push_back( BtnDescr("-/+", INVERSE) );

_btnDescr.push_back( BtnDescr(".", DOT) );

_btnDescr.push_back( BtnDescr("+", PLUS) );



Похожие работы:

«ОУП АКАДЕМИЯ ТРУДА И СОЦИАЛЬНЫХ ОТНОШЕНИЙ Екатеринбургский филиал Кафедра общепрофессиональных финансово-экономических дисциплин Утверждено Ученым Советом Филиала 24 сентября 2010 г. Учебно-методическое пособие по подготовке, оформлению и защите дипломных работ (проектов) (Для студентов заочного факультета заочной формы обучения) Екатеринбург 2011 Авторы: к.соц. наук, доцент М.И. Хрущева, к.соц. наук, ст. преподаватель О.В. Хрущев. В пособии приведены требования и специфические особенности...»

«Б А К А Л А В Р И А Т С.И. ГрИГорьев, Л.Г. ГуСЛякова, С.Н. ПавЛов Социальная работа С молодежью: основные направления и современные формы рекомендовано уМо по образованию в области социальной работы в качестве учебного пособия для студентов высших учебных заведений, обучающихся по направлению и специальности Социальная работа КнорУС • моСКВа • 2014 УДК 364(075.8) ББК 65.272я73 Г83 Рецензенты: А.И. Куропятник, д-р соц. наук, проф., А.И. Шендрик, д-р соц. наук, проф. Григорьев С.И. Г83...»

«Министерство культуры Российской Федерации Московский государственный университет культуры и искусств В.К. КЛЮЕВ ПРАВОВОЕ ОБЕСПЕЧЕНИЕ РАБОТЫ СОВРЕМЕННОЙ РОССИЙСКОЙ БИБЛИОТЕКИ Учебное пособие МОСКВА 2003 1 ББК 78.34(2)я73 К 52 Печатается по решению Редакционно-издательского совета Московского государственного университета культуры и искусств Клюев В.К. К 52 Правовое обеспечение работы современной российской библиотеки: Учеб. пособие / М-во культуры РФ; Моск. гос. ун-т культуры и искусств. – М.:...»

«КАЗАХСКИЙ НАЦИОНАЛЬНЫЙ АГРАРНЫЙ УНИВЕРСИТЕТ Н.П.ИВАНОВ доктор ветеринарных наук, профессор, академик НАН РК К.А.ТУРГЕНБАЕВ доктор ветеринарных наук, профессор А.Н. КОЖАЕВ кандидат ветеринарных наук ИНФЕКЦИОННЫЕ БОЛЕЗНИ ЖИВОТНЫХ Том 3 Болезни жвачных животных, свиней и лошадей Алматы, 2012 УДК 619:616.981.42 (075.8) ББК 48.73Я73 И22 Учебное пособие рассмотрено и рекомендовано к изданию Ученым Советом факультета Ветеринарной медицины и биотехнологии КазНАУ (протокол № 7 от 26 июня 2009 г.). \...»

«Министерство образования и науки Российской Федерации ФГБОУ ВПО Московский архитектурный институт (государственная академия) А.Д. Чебанов Приближенная оценка акустического качества залов различного функционального назначения Учебно-методические указания Москва МАРХИ 2012 3 УДК 534.2 ББК 38.113 Ч 34 Чебанов А.Д. Приближенная оценка акустического качества залов различного функционального назначения: учебно-методические указания / А.Д. Чебанов.—М.: МАРХИ, 2012. — 24 с. Учебно-методические указания...»

«МЕТОДИЧЕСКОЕ ПОСОБИЕ К УЧЕБНИКАМ ИСТОРИЯ. РОССИЯ И МИР. 10—11 КЛАССЫ. БАЗОВЫЙ УРОВЕНЬ АВТОРОВ О. В. ВОЛОБУЕВА, В. А. КЛОКОВА, М. В. ПОНОМАРЕВА, В. А. РОГОЖКИНА Предлагаемое методическое пособие адресовано учителям, работающим по линии учебников О. В. Волобуева, В. А. Клокова, М. В. Пономарева, В. А. Рогожкина История. Россия и мир. Базовый уровень для среднего общего образования (10—11 классы). Методическое пособие написано с учетом требований к результатам обучения, представленных в...»

«СМОЛЕНСКИЙ ГУМАНИТАРНЫЙ УНИВЕРСИТЕТ ФАКУЛЬТЕТ ПСИХОЛОГИИ И ПРАВА ОТДЕЛЕНИЕ ПРАВА КАФЕДРА ГОСУДАРСТВЕННО-ПРАВОВЫХ ДИСЦИПЛИН О.В. Савченкова АДМИНИСТРАТИВНОЕ ПРАВО Учебно-методическое пособие (для студентов, обучающихся по специальности 030501.65 Юриспруденция – заочная форма обучения) Смоленск – 2008 ПРОГРАММА (СОДЕРЖАНИЕ) УЧЕБНОЙ ДИСЦИПЛИНЫ РАЗДЕЛ 1. АДМИНИСТРАТИВНОЕ ПРАВО КАК ОТРАСЛЬ ПРАВА РОССИЙСКОЙ ФЕДЕРАЦИИ. ТЕМА 1. Управление, государственное управление, исполнительная власть. Общее...»

«Геманов В.С. ИСТОРИЯ РОССИЙСКОГО ФЛОТА Учебное пособие для курсантов и слушателей морских вузов 2 ББК Геманов В.С. История Российского флота. Изд. 2-е, дополненное, исправленное учебное пособие для курсантов и слушателей всех специальностей морских учебных заведений. с. Настоящие пособие в хронологическом порядке раскрывает историю зарождения и развития мореплавания славян, а затем - государства Российского, появление военного, торгово-транспортного и рыбопромыслового флотов России. Вместе с...»

«ДЕПАРТАМЕНТ ОБРАЗОВАНИЯ ГОРОДА МОСКВЫ УЧЕБНО-МЕТОДИЧЕСКИЙ ЦЕНТР ПО ПРОФЕССИОНАЛЬНОМУ ОБРАЗОВАНИЮ Рекомендации по организации и проведению промежуточной аттестации в профессиональных образовательных организациях Москва 2013 УДК 337.1 ББК 74.560 Р36 Авторы-составители: Быковец О.А., заместитель директора, начальник Управления профессионального образования ГБОУ УМЦ ПО ДОгМ; Давыдова В.Ф., методист отдела методического сопровождения реализации программ СПО Управления профессионального образования...»

«Л.С. СаЛоматина Теория и практика обучения младших школьников созданию письменных текстов различных типов (повествование, описание, рассуждение) Лекции 1–4 москва Педагогический университет Первое сентября 2010 Лариса Сергеевна Саломатина материалы курса теория и практика обучения младших школьников созданию письменных текстов различных типов (повествование, описание, рассуждение): лекции 1–4. – м.: Педагогический университет Первое сентября, 2010. – 124 с. Учебно-методическое пособие Редактор...»

«КАЗАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ Роман Баканов МАСС-МЕДИА ГЛАЗАМИ ГАЗЕТ Практические рекомендации в помощь начинающему медийному критику Учебно-методическое пособие Издательство Казанского государственного университета 2008 Файл загружен с http://www.ifap.ru УДК 070.09(075.8) Б19 Печатается по решению заседания кафедры журналистики Казанского государственного университета Протокол № 7от 24.04.2008 г. Научный редактор кандидат филологических наук, доцент Д.В.Туманов Рецензенты; кандидат...»

«СОДЕРЖАНИЕ Введение ГЛАВА 1. Сепаратизм в современном мире.8 1.1Изучение сепаратизма: история и современность 1.2Проблема этнического сепаратизма в современных международных отношениях ГЛАВА 2. Изучение проблемы этносепаратизма на примере конфликта в Нагорном Карабахе..29 2.1 Проблема Нагорного Карабаха 2.2 Проблема признания Нагорно-Карабахской Республики Заключение Список использованных источников.. 51 2 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ Абдулатипов, Р.Т. Управление этнополитическими...»

«А. А. Горелов Концепции современного естествознания УЧЕБНОЕ ПОСОБИЕ 2-е издание, переработанное и дополненное Рекомендовано Научно-методическим советом Министерства образования и науки Российской Федерации по философии в качестве учебного пособия по дисциплине Концепции современного естествознания для студентов высших учебных заведений, обучающихся по гуманитарным и социально-экономическим специальностям МОСКВА • ЮРАЙТ • 2011 УДК 50(075.8) ББК 20г.я73 ББГ68 Автор: Горелов Анатолий Алексеевич —...»

«ЮРИДИЧЕСКИЙ ИНСТИТУТ (Санкт-Петербург) И. А. КАЛАШНИКОВА ТАМОЖЕННОЕ ПРАВО Учебно-методическое пособие Направление 030900 Юриспруденция, квалификация Бакалавр юриспруденции Санкт-Петербург 2012 Автор: кандидат юридических наук, доцент Калашникова Ирина Анатольевна Учебно-методическое пособие по дисциплине Таможенное право составлено в соответствии с требованиями федеральных государственных образовательных стандартов высшего профессионального образования 3-го поколения, утвержденных 04.05.2010....»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ Бийский технологический институт (филиал) федерального государственного бюджетного образовательного учреждения высшего профессионального образования Алтайский государственный технический университет им. И.И. Ползунова А.В. Яскин ТЕОРИЯ УСТРОЙСТВА РАКЕТНЫХ ДВИГАТЕЛЕЙ Допущено научно-методическим советом БТИ АлтГТУ для внутривузовского использования в качестве учебного пособия для студентов специальности 160700.65 Проектирование авиационных и ракетных...»

«Федеральное агентство по образованию ГОУ ВПО Уральский государственный технический университет – УПИ имени первого Президента России Б.Н.Ельцина Нижнетагильский технологический институт (филиал) ОРГАНИЗАЦИЯ ПРОИЗВОДСТВА Методические рекомендации для решения задач по курсам Организация производства и менеджмент для студентов специальности 151001 - Технология машиностроения и Организация и планирование производства на предприятии для студентов специальности 190202 - Многоцелевые гусеничные и...»

«Министерство здравоохранения Ставропольского края Государственное бюджетное образовательное учреждение среднего профессионального образования Ставропольского края Пятигорский медицинский колледж И.о. Пятигорск МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ по подготовке и оформлению курсовых работ (проектов) Пятигорск, 2013 г. СОДЕРЖАНИЕ 1. Цели и задачи курсовой работы (проекта) 3 2. Выбор темы курсовой работы (проекта) 4 3. Руководство курсовой работы (проекта) 4 4.Требования к структуре, содержанию и объему...»

«Управление образования администрации города Иваново Муниципальное бюджетное образовательное учреждение средняя общеобразовательная школа № 65 Утверждено решение Педагогического совета Протокол от 30 августа 2013 года № 194 Введено в действие Приказом от 30 августа 2013 года №105-ОД Председатель Педагогического совета Директор В. А. Степович РАБОЧАЯ ПРОГРАММА по географии Ступень обучения (классы): среднее (полное) общее образование (10 – 11 классы) Количество часов: 70 часов, из них: 10 класс –...»

«ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ЮРИДИЧЕСКИЙ ФАКУЛЬТЕТ Кафедра Коммуникационный менеджмент Учебно-методический комплекс по курсу ПСИХОЛОГИЯ МАССОВОЙ КОММУНИКАЦИИ для специальности Связи с общественностью ПЕНЗА 2011 СОДЕРЖАНИЕ СОДЕРЖАНИЕ ГОСУДАРСТВЕННОГО ОБРАЗОВАТЕЛЬНОГО СТАНДАРТА ДИСЦИПЛИНЫ ПСИХОЛОГИЯ МАССОВОЙ КОММУНИКАЦИИ РАБОЧАЯ ПРОГРАММА УЧЕБНОЙ ДИСЦИПЛИНЫ ПСИХОЛОГИЯ МАССОВОЙ КОММУНИКАЦИИ ПРИМЕРНЫЙ ПЕРЕЧЕНЬ ТЕМ САМОСТОЯТЕЛЬНЫХ РАБОТ ВОПРОСЫ ПРОМЕЖУТОЧНОГО КОНТРОЛЯ ДИСЦИПЛИНЫ ПСИХОЛОГИЯ...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ Бийский технологический институт (филиал) федерального государственного бюджетного образовательного учреждения высшего профессионального образования Алтайский государственный технический университет им. И.И. Ползунова А.Ю. Лахтин, С.С. Старыгин, Г.П. Старыгина МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ ПО НАПИСАНИЮ КОНТРОЛЬНЫХ РАБОТ И РЕФЕРАТОВ Бийск Издательство Алтайского государственного технического университета им. И.И. Ползунова 2013 УДК 796.0(0.76) Рецензент: А.В....»




























 
2014 www.av.disus.ru - «Бесплатная электронная библиотека - Авторефераты, Диссертации, Монографии, Программы»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.