Часть 1 - Проектирование пользовательского интерфейсаФайлы:
Первая часть освещает проектирование базового графического пользовательского интерфейса (ГПИ) нашего приложения адресной книги. Первым шагом при создании программы с ГПИ является проектирование пользовательского интерфейса. Здесь наша задача заключается в создании меток и полей ввода информации для реализации основы адресной книги. Ниже представлен снимок экрана нашего ожидаемого результата. Нам нужны два объекта QLabel, nameLabel и addressLabel, а также два поля ввода, объект QLineEdit, nameLine, и объект QTextEdit, addressText, чтобы дать пользователю возможность ввести контактное имя и адрес. На рисунке ниже показаны используемые виджеты и их расположение. Для реализации адресной книги используются три файла:
Программирование на Qt - Создание подклассовПри написании программ Qt для добавления функциональности создают подклассы объектов Qt. Это одна из важнейших концепций после создания пользовательских виджетов или коллекций стандартных виджетов. Создание подклассов для расширения или изменения поведения виджета имеет следующие преимущества:
Поскольку Qt не предоставляет специальный виджет адресной книги, мы создадим подкласс стандартного класса виджета Qt и добавим ему функций. Создаваемый нами в этом учебном пособии класс AddressBook может быть использован в ситуациях, где нужен базовый виджет адресной книги. Определение класса AddressBookФайл addressbook.h используется для определения класса AddressBook. Сначала мы определяем AddressBook как подкласс QWidget и объявляем конструктор. Также мы используем макрос Q_OBJECT, чтобы показать, что класс использует интернационализацию и возможности сигналов и слотов Qt, даже если мы не используем все эти возможности на данном этапе. class AddressBook : public QWidget { Q_OBJECT public: AddressBook(QWidget *parent = 0); private: QLineEdit *nameLine; QTextEdit *addressText; }; Класс содержит объявления nameLine и addressText, закрытых экземпляров класса QLineEdit и QTextEdit упоминаемых ранее. Данные, сохранённые в nameLine и addressText, необходимы для многих функций адресной книги. Нам не нужно включать объявления используемых объектов QLabel, поскольку мы не будем к ним обращаться после их создания. Способ, которым Qt отслеживает принадлежность объектов, разъясняется в следующем разделе. Макрос Q_OBJECT сам по себе реализует некоторые из наиболее продвинутых возможностей Qt. В данный момент полезно думать о макросе Q_OBJECT как о горячей клавише, позволяющей нам использовать функции tr() и connect(). Теперь у нас имеется законченный файл addressbook.h и мы переходим к реализации соответствующего файла addressbook.cpp. Реализация класса AddressBookКонструктор AddressBook принимает параметр QWidget - parent. По соглашению мы передаем этот параметр в конструктор базового класса. Эта концепция владения, где родитель может иметь одного или более потомков, полезна для группирования виджетов в Qt. Например, если вы удалите родителя, все его потомки также будут удалены. AddressBook::AddressBook(QWidget *parent) : QWidget(parent) { QLabel *nameLabel = new QLabel(tr("Name:")); nameLine = new QLineEdit; QLabel *addressLabel = new QLabel(tr("Address:")); addressText = new QTextEdit; В этом конструкторе создаются объекты QLabel - nameLabel и addressLabel, а также nameLine и addressText. Функция tr() возвращает переведённую версию строки, если она имеется. В противном случае она возвращает исходную строку. Эта функция отмечает параметр QString в качестве строки, которая будет переводиться на другие языки. Её следует использовать там, где появляются строки для перевода. При программировании с Qt полезно знать, как работает компоновка. Для обработки размещения виджетов Qt предоставляет три основных класса компоновки: QHBoxLayout, QVBoxLayout и QGridLayout. Мы используем QGridLayout чтобы структурировано расположить метки и поля ввода. QGridLayout разделяет доступное пространство на сетку и помещает виджеты в ячейки, задаваемые номером строки и столбца. Вышеприведенная диаграмма показывает ячейки компоновки и расположение наших виджетов, а задаем мы эту компоновку используя следующий код: QGridLayout *mainLayout = new QGridLayout; mainLayout->addWidget(nameLabel, 0, 0); mainLayout->addWidget(nameLine, 0, 1); mainLayout->addWidget(addressLabel, 1, 0, Qt::AlignTop); mainLayout->addWidget(addressText, 1, 1); Обратите внимание на то, что addressLabel расположена используя Qt::AlignTop как дополнительный аргумент. Это сделано для того, чтобы убедиться что она не центрирована по вертикали в ячейке (1,0). За общим обзором компоновок Qt обратитесь к документу Управление компоновкой. Для того, чтобы вставить объект компоновки в виджет мы вызываем функцию виджета setLayout(): setLayout(mainLayout);
setWindowTitle(tr("Simple Address Book"));
}
В заключение, мы устанавливаем заголовок виджета в значение "Simple Address Book". Запуск приложенияОтдельный файл main.cpp используется для функции main(). Внутри этой функции мы создаем объект класса QApplication, app. QApplication отвечает за различные ресурсы приложения, например, шрифт и курсор по умолчанию, и за работу цикла событий. Таким образом, в каждом приложении ГПИ, использующем Qt, всегда имеется один объект QApplication. int main(int argc, char *argv[]) { QApplication app(argc, argv); AddressBook addressBook; addressBook.show(); return app.exec(); } Мы сконструировали новый виджет AddressBook в куче и вызываем его функцию show() чтобы отобразить его на экране. Однако, виджет не будет показан до тех пор, пока не стартует цикл обработки событий приложения. Мы запускаем цикл обработки событий вызывая функцию приложения exec(); возвращаемый этой функцией результат используется в качестве возвращаемого значения функции main(). В этом месте он становится видимым ведь мы создаём объект AddressBook в куче: Теперь он выходит из области видимости. Поэтому, AddressBook и все его дочерние виджеты будут удалены, предотвращая этим утечки памяти. |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |