Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке? Тип приложения - не Qt, Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.
|
Создание графического интерфейса средствами Qt
13.2 Компоновка (Layouts)
Для того, чтобы оптимально разместить виджеты на форме, необходимо учесть ряд деталей:
- размер соседних виджетов;
- визуальные компоненты могут динамически изменять размер, исчезать или появляться в следствии работы логики программы;
- форма, в которой размещают виджеты, может динамически изменять размер при работе программы (когда пользователь меняет размер окна либо раскрывает его на весь экран);
- часто нужно растянуть визуальную компоненту таким образом, чтобы она занимала всё пространство формы, или же чтобы несколько компонент занимали пространство формы пропорционально (в соответствующих пропорциях 1:1, 1:2, 3:5 и т.д.);
- часто нужно разместить виджеты либо группы виджетов вертикально либо горизонтально на форме.
Понятно, что такая логика является довольно сложной для реализации при создании пользовательских интерфейсов разной структуры. К счастью в арсенале Qt есть довольно мощный инструмент для упорядочивания виджетов на форме — компоновщик.
Компоновщик позволяет упорядочить размещение компонент, оставляя интерфейс гибким для внесения изменений, таких как изменение размера либо количества элементов на форме. Компоновщик также может обеспечивать адекватное изменение размера самого виджета в ответ на перемены в его наполнении.
Компоновщик не принадлежит к виджетам, не наследует от QWidget и является невидимым на форме. Он только управляет её размером и размещением её содержания.
Обычно используют три основных класса компоновщика:
- вертикальная компоновка (класс QVBoxLayout);
- горизонтальная компоновка (класс QHBoxLayout);
- компоновка сеткой (класс QGridLayout);
Для того, чтобы продемонстрировать работу с компоновками, используем предыдущий пример добавив ещё несколько элементов и сделав так, чтобы размещение элементов было пропорциональным и соответствовало изменениям размеров окна. Попытаемся создать такой интерфейс:
- метки и поля ввода разместим горизонтально в одной строке;
- создадим три такие строки с метками и полями;
- добавим ещё одну строку с двумя кнопками горизонтально и правым выравниванием.
Создадим проект LayoutExample. Для этого воспользуемся мастером новых проектов. Выберем в списке Qt Widgets Application. Зададим название для проекта и настроим класс главного окна: зададим родительский класс (в выпадающем списке Base Class установим QWidget) и снимем флажок для автоматической генерации файла формы (Generate Form) (см. рис. 13.4).
Откроем файл mainwindow.cpp и изменим код конструктора окна:
#include <QHBoxLayout> #include <QVBoxLayout> #include <QLabel> #include <QLineEdit> #include <QPushButton> MainWindow::MainWindow ( QWidget * parent ) : QWidget ( parent ) { //Первая горизонтальная строка. Начальный текст в поле ввода QLineEdit * lLineEdit = new QLineEdit ( " Text1 " ); //Задаём текст. & — означает комбинацию клавиш для активации виджета QLabel * lLabel = new QLabel ( " LineEdit &1 " ); //Задаём виджет на который будет переключаться фокус ввода при нажатии Alt+1 lLabel ->setBuddy ( lLineEdit ); //Размещаем поле ввода и метку в одной строке QHBoxLayout *lHBoxLayout = new QHBoxLayout; lHBoxLayout->addWidget ( lLabel ); lHBoxLayout->addWidget ( lLineEdit ); //Вторая горизонтальная строка QLineEdit * lLineEdit 2 = new QLineEdit ( " Text2 " ); QLabel * lLabel 2 = new QLabel ( " LineEdit &2 " ); lLabel 2 ->setBuddy ( lLineEdit 2 ); QHBoxLayout *lHBoxLayout2 = new QHBoxLayout; lHBoxLayout2->addWidget ( lLabel 2 ); lHBoxLayout2->addWidget ( lLineEdit 2 ); //Третий ряд виджетов с кнопками QPushButton *lPushButtonOk = new QPushButton ( " & ok " ); QPushButton * lPushButtonCancel=new QPushButton ( " & Cancel " ); QHBoxLayout *lHBoxLayout3 = new QHBoxLayout; //Добавим элемент-растяжку он займёт всё возможное свободное пространство //и "прижмёт"кнопки к краю lHBoxLayout3->addStretch ( ); lHBoxLayout3->addWidget ( lPushButtonOk ); lHBoxLayout3->addWidget ( lPushButtonCancel ); //Добавим компоновку вертикально в колонку QVBoxLayout *lVBoxLayout = new QVBoxLayout; lVBoxLayout->addLayout ( lHBoxLayout ); lVBoxLayout->addLayout ( lHBoxLayout2 ); lVBoxLayout->addLayout ( lHBoxLayout3 ); //Задаём компоновщик для окна setLayout ( lVBoxLayout ); }
После запуска программы получим главное окно с размещёнными в компоновщиках виджетами (см. рис. 13.5).
13.2.1 Компоновка сеткой (класс QGridLayout)
Рассмотрим работу с компоновщиками на ещё одном примере. На этот раз мы создадим простую программу-калькулятор и используем компоновщики QGridLayout.
Создадим новый проект так же, как для предыдущего примера. Добавим члены класса — указатели на цифровые кнопки (0-9), кнопку для сброса результата (С) и для суммирования\отображения результата (+/ =). Для создания визуальных элементов в окне — объявим отдельный частный метод createWidgets().
#include <QWidget> //Предварительное объявление классов class QPushButton; class QLCDNumber; class CalculatorMainWindow : public QWidget { Q_OBJECT public : explicit CalculatorMainWindow ( QWidget * parent = 0 ); ˜CalculatorMainWindow ( ); private : //Отдельный метод для создания интерфейса программы void createwidgets ( ); private : //Цифровые кнопки QPushButton *pushButton; QPushButton *pushButton_2; QPushButton *pushButton_3; QPushButton *pushButton_4; QPushButton *pushButton_5; QPushButton *pushButton_6; QPushButton *pushButton_7; QPushButton *pushButton_8; QPushButton *pushButton_9; QPushButton *pushButton_10; //Кнопка вывода результата и суммирования QPushButton *pushButtonP lus; //Кнопка сброса результата QPushButton *pushButtonC; //Виджет — цифровой дисплей QLCDNumber *lcdNumber; };
В файл реализации включим необходимые .h-файлы:
#include <QPushButton> #include <QGridLayout> #include <QLCDNumber>
Определим метод createWidgets(), ответственный за создание интерфейса программы-калькулятора. В нём создадим элемент QLCDNumber для отображения следующего слагаемого и результата. Для упрощения примера запрограммируем только операцию сложения целых чисел. Поэтому калькулятор будет содержать только цифровые кнопки (0-9), кнопку добавления/вывода результата и кнопку сброса результата. Все элементы пользовательского интерфейса разместим в одной компоновке QGridLayout:
void CalculatorMainWindow::createwidgets ( ) { QGridLayout *lCalcLayout = new QGridLayout; setLayout ( lCalcLayout ); lcdNumber = new QLCDNumber; pushButton = new QPushButton ( " 1 " ); pushButton_2 = new QPushButton ( " 2 " ); pushButton_3 = new QPushButton ( " 3 " ); pushButton_4 = new QPushButton ( " 4 " ); pushButton_5 = new QPushButton ( " 5 " ); pushButton_6 = new QPushButton ( " 6 " ); pushButton_7 = new QPushButton ( " 7 " ); pushButton_8 = new QPushButton ( " 8 " ); pushButton_9 = new QPushButton ( " 9 " ); pushButton_10 = new QPushButton ( " 0 " ); pushButtonC = new QPushButton ( " C " ); pushButtonP lus = new QPushButton ( " + / = " ); lCalcLayout->addWidget ( lcdNumber, 0, 0, 1, 4 ); lCalcLayout->addWidget ( pushButton, 1, 0 ); lCalcLayout->addWidget ( pushButton_2, 1, 1 ); lCalcLayout->addWidget ( pushButton_3, 1, 2 ); lCalcLayout->addWidget ( pushButton_4, 2, 0 ); lCalcLayout->addWidget ( pushButton_5, 2, 1 ); lCalcLayout->addWidget ( pushButton_6, 2, 2 ); lCalcLayout->addWidget ( pushButton_7, 3, 0 ); lCalcLayout->addWidget ( pushButton_8, 3, 1 ); lCalcLayout->addWidget ( pushButton_9, 3, 2 ); lCalcLayout->addWidget ( pushButton_10, 4, 0, 1, 3 ); lCalcLayout->addWidget ( pushButtonC, 1, 3 ); lCalcLayout->addWidget ( pushButtonP lus, 2, 3, 3, 1 ); }
Метод addWidget() класса QGridLayout принимает в качестве параметров указатель на виджет, а также строку и столбец для размещения виджета. Количество строк и столбцов задают заранее, оно может быть произвольным и определяется в процессе добавления виджетов к компоновщику. Перегруженный вариант метода addWidget() используем для добавления кнопок "0", "+/ =" и виджета QLCDNumber на форму. Он принимает два дополнительных параметра. Они определяют количество ячеек по горизонтали и по вертикали, которые будет занимать виджет в компоновщике. Обычно каждый элемент занимает одну ячейку в компоновщике. Последний параметр метода addWidget() указывает выравнивание элемента внутри ячейки (флажки Qt::Alligment).
В заключение добавим к конструктору вызов метода для создания элементов в окне.
CalculatorMainWindow::CalculatorMainWindow ( QWidget * parent ) : QWidget ( parent ) { resize ( 300, 300 ); setWindowTitle ( " Simple Calculator " ); createwidgets ( ); }