Создание графических интерфейсов пользователя с использованием Qt 5.12 (Методические пособия по C++ Г.С.Иванова 3 части), страница 2
Описание файла
PDF-файл из архива "Методические пособия по C++ Г.С.Иванова 3 части", который расположен в категории "". Всё это находится в предмете "объектно-ориентированное программирование (ооп)" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 2 страницы из PDF
Объекты этогокласса отвечают за создание и инициализацию главного окна, а также за запуск цикла обработки сообщений от операционной системы.В качестве окна приложения будем использовать объект класса QWidget. КлассQWidget – базовый класс всех виджетов. Его объекты обладают свойствами контейнера,который управляет виджетами визуальных компонентов: метками, кнопками и др., размещенными в окне.Кроме этого нам понадобится объект класса QLabel – метка – виджет, с помощьюкоторого высвечивается текст приветствия, и объект класса QPushButton – кнопка – виджет, который используется для закрытия приложения.Текст программы выглядит следующим образом:#include#include#include#include<QApplication><QLabel><QPushbutton.h><QHBoxLayout>int main(int argc,char *argv[]){QApplication app(argc,argv);QWidget win;win.setWindowTitle("Hello");// создание объекта-приложения// создание объекта управления окном// изменение заголовка окнаQLabel *helloLabel=new QLabel("Hello!",&win); // создание меткиQPushButton *exitButton=new QPushButton("Close",&win);// создание кнопкиQHBoxLayout *layout = new QHBoxLayout(&win); // создание// менеджера компоновки для управления размещением метки и кнопки в окне winlayout->addWidget(helloLabel); // добавление метки к компоновщикуlayout->addWidget(exitButton); // добавление кнопки к компоновщику// связь сигнала нажатия кнопки с закрытием окна winQObject::connect(exitButton,SIGNAL(clicked(bool)),&win,SLOT(close()));win.show();// визуализация окна winapp.exec();// запуск цикла обработки сообщений приложения}Помимо уже указанных объектов окна, метки и кнопки приложение включает такжеобъект класса QHBoxLayout – горизонтальный менеджер компоновки, отвечающий заразмещение и масштабирование подчиненных виджетов: метки и кнопки в окне приложения.
Этот объект срезу при создании связывается с оконным объектом win:QVBoxLayout *layout = new QVBoxLayout(&win);А затем ему передается управление размерами и размещением метки и кнопки:layout->addWidget(helloLabel);layout->addWidget(exitButton);Особого внимания заслуживает оператор (макрос) Qt connect, который связываетсигнал нажатия кнопки exitButton – clicked(bool) с его обработчиком:QObject::connect(exitButton,SIGNAL(clicked(bool)),&win,SLOT(close()));Таким обработчиком – слотом окна win – является метод закрытия окна win –close().
По правилам оконных приложений этот метод обеспечивает не только закрытие окна, но и завершение приложения, если закрываемое окно – последнее.Все объекты создаются в основной программе (рисунок 1.2, а), но при этом виджетокна назначается контейнером для всех остальных и управляет видимостью виджетов ипамятью всех объектов Qt. Поэтому для визуализации окна с меткой и кнопкой достаточно вызвать метод Show() окна win, который обеспечит визуализацию, как самого окна,так и управляемых им виджетов (рисунок 1.2, б).ВизуализироватьСоздатьПрограммаПрограммаwinwinСоздатьlayoutСоздатьlayoutВизуализироватьСоздатьhelloLabelВизуализироватьexitButtonhelloLabelаexitButtonбОсвободитьПрограммаПрограммаwinwinИзменитьразмерыОсвободитьlayoutИзменитьразмерыlayoutИзменитьразмерыhelloLabelвexitButtonОсвободитьhelloLabelОсвободитьexitButtonгРисунок 1.2 – Управление объектами Qt в процессе работы программы:а – создание виджетов основной программой, б – управление видимостью виджетов через контейнер окна;в – управление изменением размеров виджетов посредством менеджера компоновки; г – освобождение памяти через контейнер окна ()После визуализации окна выполняется метод app.exec(), который запускаетсяцикл обработки сообщений, организуя работу приложения.Менеджер компоновки окна, как и само окно, является контейнером, но только длявключенных в него виджетов метки и кнопки.
Он управляет изменением размеров подчиненных виджетов при изменении размеров окна (рисунок 1.2, в).После завершения программы для освобождения всей динамически распределеннойпамяти достаточно посредством оператора delete запросить освобождение памяти окнаwin. Деструктор этого объекта-контейнера автоматически освободит все управляемые имвиджеты (рисунок 1.2, г) и прочие компоненты.1.1.2 Разработка собственного класса окна приложенияАнализ диаграмм, приведенных на рисунке 1.1, показывает, что практически всеуправление компонентами окна, кроме их создания, реализуется программой не напрямую, а с использованием управляющего контейнера – объекта окна. Поэтому более логично и создание подчиненных компонентов возложить на виджет окна, для чего необходимо создать специальный класс окна.Пример 1.2.
Приложение Hello. Проектирование Qt интерфейса с использованиемспециального класса окна.Класс окна обычно наследуется от одного из классов Qt. В нашем случае, как и впервом примере, наследование будем выполнять от класса QWidget (рисунок 1.3).QWidgetWinQLabelhelloLabelexitButtonQPushButtonWin()Рисунок 1.3 – Диаграмма классов приложения HelloПри наследовании управляемые окном виджеты Кнопка и Метка будут включены впроектируемый класс в качестве указателей на объекты соответствующих классов. Отношение между классами компонентов и проектируемым классом – наполнение.Несколько более сложная ситуация с менеджером компоновки. Объект этого классаработает только в конструкторе класса окна и более нигде не используется. Поэтому целесообразно объявлять и создавать этот объект только в конструкторе проектируемогокласса в качестве локальной переменной. Такое решение позволит сократить количествообъектных полей класса окна и, соответственно, упростить его описание.Компоновать приложение будем по схеме, рекомендуемой для программ на языкеС++ (рисунок 1.4): файл hello.h будет содержать описание интерфейсного класса окна, файл hello.cpp – реализацию методов этого класса, файл main.cpp – основную программу.main.cppЗависитhello.hРеализуетhello.cppРисунок 1.4 – Диаграмма компоновки приложения HelloФайл win.h с описанием класса окна:#ifndef hello_h#define hello_h#include <QLabel>#include <QPushButton>class Win: public QWidget{QLabel *helloLabel;QPushButton *exitButton;public:Win(QWidget *parent = 0);};#endifПримечание.
Для предотвращения повторной компиляции этого файла используетсястандартный прием: в начале стоит проверка существования переменной win_h препроцессора.Если эта переменная задана, то файл уже был компилирован, если не задана – то переменнаяопределяется, а файл компилируется.Файл win.cpp содержит описание конструктора класса Win:#include "hello.h"#include <QHBoxLayout>Win::Win(QWidget *parent):QWidget(parent){setWindowTitle("Hello");helloLabel=new QLabel("Hello!",this);exitButton=new QPushButton("Exit",this);QHBoxLayout *layout = new QHBoxLayout(this); // создание элемента// компоновки для управления размещением метки и кнопки в окне winlayout->addWidget(helloLabel); // добавление метки к компоновщикуlayout->addWidget(exitButton); // добавление кнопки к компоновщику// связь сигнала нажатия кнопки и слота закрытия окнаconnect(exitButton,SIGNAL(clicked(bool)),this,SLOT(close()));}Файл main.cpp содержит основную программу:#include "hello.h"#include <QApplication>int main(int argc, char *argv[]){QApplication app(argc, argv);Win win(0);win.show();return app.exec();}Несмотря на то, что программа получилась более длинной, с точки зрениятехнологии она грамотнее построена и, следовательно, в ней проще разбираться, чтоособенно важно при разработке больших программ.1.1.3 Создание русскоязычного интерфейса в QtПроблема неправильного отображения русских букв в интерфейсах программ наязыке С++ связана с тем, что при вводе программы выводимые строки представлены в кодировке Windows-1251 (стандартная 8-битная кодировка русских версий Windows), а наэкране при запуске программ в операционной системе Windows – в кодировке Unicode.В кодировке Unicode все символы кодируются не 8-ми, а 16-ти битными кодами, чторасширяет таблицу кодов более чем до 65 тыс.
комбинаций и обеспечивает не только кодировку английских букв, но и символов национальных алфавитов, в том числе русского.Преобразование в Unicode при запуске программы выполняется автоматически, израсчета, что исходный текст представлен в кодировке Windows-1252 (базовый западноевропейский вариант 8-ми битной кодировки). Таким образом, для символов английскогоалфавита, коды которых в обеих таблицах совпадают, преобразование проходит нормально, а для символов русского – с искажением.Согласно концепции Qt все надписи формы хранятся сразу в кодировке Unicode ввиде строк – объектов класса QString, поэтому с отображением этих надписей на экранепроблем не возникает.
Но преобразование выводимых строк в Unicode при их описанииследует выполнить программно.Для работы с разными, в том числе национальными кодировками в Qt определеносемейство классов, одним из которых является класс QTextCodec. Объекты этого классаобеспечивают необходимые перекодировки и в том числе преобразование строк в Unicodeв соответствии с используемой таблицей кодов. Таблица кодов русского языка 1251 можетбыть установлена при создании объекта класса QTextCodec:QTextCodec *codec = QTextCodec::codecForName("Windows-1251");Процесс перекодировки в Unicode осуществляется посредством метода:QString QTextCodec::toUnicode(char *str);например:helloLabel = new QLabel(codec->toUnicode("Привет!"),this);Пример 1.3. Приложение Hello.
Создание русскоязычного интерфейса.Создание интерфейса на русском языке по сравнению с программой примера 1.2 потребует незначительного изменения только файлов описания и реализации окна. Файлпрограммы main.cpp при этом останется без изменения.Файл win.h:#ifndef win_h#define win_h#include <QTextCodec>#include <QLabel>#include <QPushButton>class Win:public QWidget{private:QTextCodec *codec; // перекодировщикQLabel *helloLabel;QPushButton *exitButton;public:Win(QWidget *parent = 0);};#endifФайл win.cpp:#include "win.h"#include <QHBoxLayout>Win::Win(QWidget *parent):QWidget(parent){codec = QTextCodec::codecForName("Windows-1251");setWindowTitle(codec->toUnicode("Приветствие"));helloLabel = new QLabel(codec->toUnicode("Привет!"),this);exitButton =new QPushButton(codec->toUnicode("Выход"),this);QHBoxLayout *layout = new QHBoxLayout(this);layout->addWidget(helloLabel);layout->addWidget(exitButton);connect(exitButton,SIGNAL(clicked(bool)),this,SLOT(close()));}После запуска программы получаем на экране окно с текстом на русском языке(рисунок 1.5).Рисунок 1.5 – Интерфейс на русском языкеПримечание.