Класс QUiLoader расположен в отдельной библиотеке. Для использования класса QUiLoader в приложении Qt мы должны добавить в файл .pro следующую строку:
CONFIG += uitools
Динамические диалоговые окна позволяют изменять компоновку элементов формы без повторной компиляции приложения. Они могут также использоваться для создания «тонких» клиентских приложений, когда в исполняемый модуль встраивается только основная форма пользовательского интерфейса, а все другие формы создаются по мере необходимости.
Встроенные классы виджетов и диалоговых окон
QMenuBar, QToolBarВстроенные виджеты и стандартные диалоговые окна обладают большими функциональными возможностями, которыми можно пользоваться без дополнительного программирования. Многие специальные требования обеспечиваются установкой свойств виджетов или путем применения механизма сигналов и слотов и реализации пользовательских определений слотов.
В некоторых случаях может возникнуть потребность в создании пользовательского виджета без помощи стандартных средств. В Qt это делается просто, и возможности пользовательских виджетов будут обладать таким же свойством независимости от платформы, как и возможности встроенных виджетов Qt. Пользовательские виджеты даже можно интегрировать в Qt Designer, и тогда они могут применяться так же, как и встроенные виджеты Qt. В объясняются способы создания пользовательских виджетов.
Глава 3. Создание главных окон
Главное окно приложения обеспечивает каркас для построения пользовательского интерфейса приложения. Данная глава будет строиться на основе главного окна приложения Электронная таблица, показанного на рис. 3.1. В приложении Электронная таблица используются созданные в диалоговые окна Find, Go-to-Cell и Sort (найти, перейти на ячейку и сортировать).
Рис. 3.1. Приложение Электронная таблица.
В основе большинства приложений с графическим интерфейсом лежит программный код, обеспечивающий базовые функции, например, чтения и записи файлов или обработки данных, представленных в пользовательском интерфейсе. В мы рассмотрим способы реализации такой функциональности, вновь используя в качестве примера приложение Электронная таблица.
Создание подкласса QMainWindow
QMainWindow. QDialog QMainWindow QWidget.Главные окна можно создавать при помощи Qt Designer, но в данной главе мы продемонстрируем, как это все делается при непосредственном программировании. Если вы предпочитаете пользоваться визуальными средствами проектирования, то необходимую информацию вы сможете найти в главе «Creating a Main Window Application» (Создание приложения на основе класса главного окна) в онлайновом руководстве по Qt Designer.
Исходный код программы главного окна приложения Электронная таблица содержится в двух файлах: mainwindow.h и mainwindow.cpp. Сначала приведем заголовочный файл:
01 #ifndef MAINWINDOW_H
02 #define MAINWINDOW_H
03 #include <QMainWindow>
04 class QAction;
05 class QLabel;
06 class FindDialog;
07 class Spreadsheet;
08 class MainWindow : public QMainWindow
09 {
10 Q_OBJECT
11 public:
12 MainWindow();
13 protected:
14 void closeEvent(QCloseEvent *event);
Мы определяем класс MainWindow как подкласс QMainWindow. Он содержит макрос Q_OBJECT, поскольку имеет собственные сигналы и слоты.
Функция closeEvent() определена в QWidget как виртуальная функция; она автоматически вызывается при закрытии окна пользователем. Она переопределяется в MainWindow для того, чтобы можно было задать пользователю стандартный вопрос относительно возможности сохранения изменений («Do you want to save your changes?») и чтобы сохранить на диске пользовательские настройки.
15 private slots:
16 void newFile();
17 void open();
18 bool save();
19 bool saveAs();
20 void find();
21 void goToCell();
22 void sort();
23 void about();
Некоторые функции меню, как, например, File | New (Файл
| Создать) или Help | About (Помощь | О программе), реализованы в MainWindow в виде закрытых слотов. Большинство слотов возвращают значение типа void, однако save() и saveAs() возвращают значение типа bool. Возвращаемое значение игнорируется при выполнении слота в ответ на сигнал, но при вызове слота в качестве функции мы может воспользоваться возвращаемым значением, как это мы можем делать при вызове любой обычной функции С++.
24 void openRecentFile();
25 void updateStatusBar();
26 void spreadsheetModified();
27 private:
28 void createActions();
29 void createMenus();
30 void createContextMenu();
31 void createToolBars();
32 void createStatusBar();
33 void readSettings();
34 void writeSettings();
35 bool okToContinue();
36 bool loadFile(const QString &fileName);
37 bool saveFile(const QString &fileName);
38 void setCurrentFile(const QString &fileName);
39 void updateRecentFileActions();
40 QString strippedName(const QString &fullFileName);
Для поддержки пользовательского интерфейса главному окну потребуется еще несколько закрытых слотов и закрытых функций.
41 Spreadsheet *spreadsheet;
42 FindDialog *findDialog;
43 QLabel *locationLabel;