[Содержание] [Следующий: Урок 2]
Адресная книга. Урок 1 - Проектирование пользовательского интерфейса
Файлы:
Первая часть учебного пособия освещает проектирование базового графического пользовательского интерфейса (ГПИ), используемого в приложении "Адресная книга".
Первым шагом при создании программ с ГПИ является проектирование пользовательского интерфейса. Нашей задачей на этом уроке является установка метки поля ввода, необходимую для реализации основы приложения адресной книги. Ниже представлен снимок экрана нашего ожидаемого результата.
Нам нужны два объекта QLabel, nameLabel и addressLabel, а также два поля ввода, объект QLineEdit, nameLine, и объект QTextEdit, addressText, чтобы дать пользователю возможность ввести контактное имя и адрес. На рисунке ниже показаны используемые виджеты и их расположение.
Для реализации адресной книги используются три файла:
- addressbook.h - файл определения класса AddressBook,
- addressbook.cpp - файл реализации класса AddressBook, и
- main.cpp - файл содержит функцию main() с экземпляром AddressBook.
Программирование на 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 полезно знать, как работает компоновка. Для обработки размещения виджетов 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 = new AddressBook;
addressBook->show();
return app.exec();
}
Мы сконструировали новый виджет AddressBook в куче используя ключевое слово new и вызываем его функцию show() чтобы вывести его на экран. Однако, виджет не будет показан до тех пор, пока не стартует цикл обработки событий приложения. Мы запускаем цикл обработки событий вызывая функцию приложения exec(); возвращаемый этой функцией результат используется в качестве возвращаемого значения функции main().
[Содержание] [Следующий: Урок 2]
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies) |
Торговые марки |
Qt 4.5.3 |
|