Использование массивов в C++ связано с рядом неудобств. Для их устранения разработаны классы-хранилища, как в стандартной библиотеке C++, так и в Qt (QVector<T>, QList<T>, QLinkedList<T>, QStack<T>, QQueue<T>, QMap<K,T>, QMultiMap<K,T>, QHash<K,T> и QMultiHash<K,T>) см. [Шлее, глава 4]. Символы T и K означают, что контейнер может быть использован для хранения данных любого типа.
Наиболее универсальным является класс QList. Примеры его использования:
QList<int> listI;
QList<QString> listS;
Добавить данные можно с помощью операции направления в поток.
listS << "один" << "два" << "три";
У всех контейнеров есть общие методы:
число элементов
int size() const;
удалить все элементы
void clear();
строка пустая? true, если size() == 0
bool isEmpty() const;
Также для них перегружены операторы сравнения == и!=.
Контейнер QStringList
Класс QStringList является альтернативным определением для контейнера QList<QString>. Кроме того, существует несколько дополнительных функций. Строка может быть разбита на подстроки с помощью функции QStringList::split():
QString str = "polluter pays principle";
QStringList words = QStringList::split(" ", str);
В этом примере, строка "polluter pays principle" разбивается на три строки; "polluter", "pays" и "principle". Функция split() может принимать третий необязательный параметр типа bool, который определяет – должны ли игнорироваться пустые подстроки (по умолчанию) или нет.
Элементы списка QStringList могут быть объединены в одну строку, с помощью функции join(). В качестве аргумента ей передается строка, которая должна быть вставлена между объединяемыми строками. Например, следующий код демонстрирует, как можно объединить все строки в списке, отсортированном по алфавиту, в единую строку, причем подстроки отделяются друг от друга символом перевода строки:
words.sort();
str = words.join("\n");
Еще одна немаловажная операция над строками – определение длины строки. Для этого предназначена функция length() и, как вариант, isEmpty(), которая возвращает true, если длина строки равна 0.
Использование редактора форм (Qt Designer)
Как правило, создание программы начинается с заполнения главного окна виджетами. Проще всего сделать это в редакторе форм Qt Designer, встроенному в Qt Creator. Для его запуска достаточно дважды кликнуть по файлу формы (mainwindows.ui в нашем проекте). Все результаты редактирования форм, рассматриваемые в данном разделе можно произвести, путём добавления кода в файлы mainwindows.h и mainwindows.cpp. Но использование редактора форм позволит ускорить и упростить процесс разработки. Окно Qt Designer, вызываемое двойным кликом мыши по файлу mainwindows.ui, изображено на рисунке.
Z |
X |
Рисунок – окно Qt Designer
В центральной части окна изображён прототип (форма) будущего окна (1). В правой верхней части редактора форм расположено окно с перечнем всех виджетов (2), расположенных на данной форме. С помощью перетаскивания можно поместить любой из доступных в списке (3) виджетов на форму. При выделении одного из виджетов на прототипе или в перечне в правой нижней части окна становится доступна таблица его свойств (4). Свойства выбранного виджета и могут быть изменены. К основным свойствам графических объектов, объявленных в классе QWidget, относятся доступность, политика разметов, минимальный, максимальный и базовый размеры, палитра, шрифт и его характеристики, тип курсора. Основные графические компоненты: элементы формирования, элементы управления, элементы ввода (InputWidgets), элементы отображения (DisplayWidgets). В нижней части окна находится 2 области для редактирования действий и редактирования сигналов и слотов (5).
Приложение QDesigner содержит инструменты для создания слотов пользовательских объектов, переопределения виджетов на форме и формирования меню.
Элементы формирования
Виджеты, которые используются для размещения других элементов, но сами не отображаются. Очень полезной функцией редактора является автоматическая компоновка виджетов. Оно осуществляется с помощью нажатия кнопки (Z на рис. выше) или кнопки (X на рис. выше) после предварительного размещения объектов на форме. Кроме того, можно применять компоновку для размещения элементов на отдельных виджетах-компоновщиках (см. закладку Layouts в списке доступных виджетов).
Элементы управления
Кнопки (Button)
Базовым для всех кнопок является класс QAbstractButton. В нем реализованы методы и возможности, присущие всем кнопкам. В редакторе форм, соответствующие QAbstractButton параметры выделены зелёным фоном.
Рисунок – свойства объекта QAbstractButton
Таблица – свойства объекта QAbstractButton
Свойство | Тип | Описание |
text | QString | Поясняющая надпись на кнопке. |
shortcut | QKeySequence | Хранит введённую комбинацию клавиш. Делает эквивалентными нажатие кнопки мышью и нажатие выбранного сочетания клавиш. |
checkable | bool | Переводит кнопку в режим выключателя (триггера). После этого становится активным свойство checked. |
checked | bool | Состояние переключателя (вкл./выкл. т.е. true/false, 1/0) |
autoRepeat | bool | Если это свойство установлено, то сигналы pressed(), released() и clicked(). |
autoExclusive | bool | Если это свойство установлено, то все кнопки, являющиеся дочерними для одного виджета, будут вести себя так, как будто они входят эксклюзивную группу. В эксклюзивной группе только одна из кнопок может иметь свойство checked равное true. |
autoRepeatDelay | int | Начальная задержка перед автоповтором (в миллисекундах), работающим, когда разрешён autoRepeat. |
autoRepeatInterval | int | Интервал автоповторения клика в случае зажатия кнопки мыши (в миллисекундах) |
Для свойств, приведённых в таблице существуют интерфейсы с типовыми названиями. Методы для получения значений свойств часто совпадают с ними по названию. Иногда названия состоит из названия свойства из приставки "is" и названия метода, см. таблицу ниже. Некоторые из приведённых методов являются сигналами и слотами.
Таблица – методы-интерфейсы свойств класса QAbstractButton
Свойство | Метод установки значения | Метод получения значения |
text | setText(QString) | text() |
shortcut | setShortcut(const QKeySequence &key) | shortcut() |
checkable | setCheckable(bool) | isCheckable() |
checked | setChecked(bool) | isChecked() |
autoRepeat | setAutoRepeat(bool) | autoRepeat() |
autoExclusive | setAutoExclusive(bool) | autoExclusive() |
autoRepeatDelay | setAutoRepeatDelay(int) | autoRepeatDelay() |
autoRepeatInterval | setAutoRepeatInterval(int) | autoRepeatInterval() |
Как можно увидеть в справочной документации, большинство функций, перечисленных в третьей колонки таблицы имеют модификатор const
QString text () const
который используется в C++ для обозначения функций, не изменяющих значения своих свойств в процессе работы. Далее приведём таблицы сигналов и слотов.
Таблица – сигналы класса QAbstractButton.
Сигнал | Описание |
clicked() | отправляется при щелчке кнопкой мыши |
pressed() | отправляется при нажатии на кнопку мыши |
released() | отправляется при отпускании кнопки мыши |
toggled() | отправляется при изменении состояния кнопки, имеющей статус выключателя |
Таблица – слоты класса QAbstractButton.
Слот | Описание |
click() | Имитирует щелчок по кнопке |
toggle() | Меняет состояние кнопки-выключателя |
Класс QAbstractButton имеет классы-наследники QCheckBox, QPushButton, QRadioButton, QToolButton, др. Эти объекты присутствуют списке доступных виджетов Qt Designer и могут быть размещены на форме. Их свойства и методы QAbstractButton доступны в них. Больше информации о использовании виджетов можно найти в [Шлее 5.3 гл. 7-11]