44 QLabel *formulaLabel;
45 QStringList recentFiles;
46 QString curFile;
47 enum { MaxRecentFiles = 5 };
48 QAction *recentFileActions[MaxRecentFiles];
49 QAction *separatorAction;
50 QMenu *fileMenu;
51 QMenu *editMenu;
52 QToolBar *fileToolBar;
53 QToolBar *editToolBar;
54 QAction *newAction;
55 QAction *openAction;
56 QAction *aboutQtAction;
57 };
58 #endif
Кроме этих закрытых слотов и закрытых функций в подклассе MainWindow имеется также много закрытых переменных. По мере их использования мы будем объяснять их назначение.
Теперь мы кратко рассмотрим реализацию этого подкласса:
01 #include <QtGui>
02 #include "finddialog.h"
03 #include "gotocelldialog.h"
04 #include "mainwindow.h"
05 #include "sortdialog.h"
06 #include "spreadsheet.h"
Мы включаем заголовочный файл <QtGui>, который содержит определения всех классов Qt, используемых нашим подклассом. Мы также включаем некоторые пользовательские заголовочные файлы из , а именно finddialog.h, gotocelldialog.h и sortdialog.h.
07 MainWindow::MainWindow()
08 {
09 spreadsheet = new Spreadsheet;
10 setCentralWidget(spreadsheet);
11 createActions();
12 createMenus();
13 createContextMenu();
14 createToolBars();
15 createStatusBar();
16 readSettings();
17 findDialog = 0;
18 setWindowIcon(QIcon(":/images/icon.png"));
19 setCurrentFile("");
20 }
В конструкторе мы начинаем создание виджета Электронная таблица Spreadsheet и определяем его в качестве центрального виджета главного окна. Центральный виджет занимает среднюю часть главного окна (см. рис. 3.2). Класс Spreadsheet является подклассом QTableWidget, который обладает некоторыми возможностями электронной таблицы: например, он поддерживает формулы электронной таблицы. Реализацию этого класса мы рассмотрим в .
Рис. 3.2. Области главного окна QMainWindow.
Мы вызываем закрытые функции createActions(), createMenus(), createContextMenu(), createToolBars() и createStatusBar() для построения остальной части главного окна. Мы также вызываем закрытую функцию readSettings() для чтения настроек, сохраненных в приложении.
Мы инициализируем указатель findDialog в нулевое значение, а при первом вызове MainWindow::find() мы создадим объект FindDialog. B конце конструктора в качестве пиктограммы окна мы задаем PNGфайл: icon.png. Qt поддерживает многие форматы графических файлов, включая BMP, GIF, JPEG, PNG, PNM, XBM и XPM. Функция QWidget::setWindowIcon() устанавливает пиктограмму
в левый верхний угол окна. К сожалению, не существует независимого от платформы способа установки пиктограммы приложения, отображаемого на рабочем столе компьютера. Описание этой процедуры для различных платформ можно найти в сети Интернет по адресу , родительское окно (главное окно), пиктограмму (new.png ), клавишу быстрого вызова команды (Ctrl+N) и сообщение в строке состояния. Мы подсоединяем к сигналу этого действия triggered() закрытый слот главного окна newFile(); этот слот мы реализуем в следующем разделе. Это соединение гарантирует, что при выборе пользователем пункта меню File | New (файл | создать), при нажатии им кнопки New на панели инструментов или при нажатии клавиш Ctrl+N будет вызван слот newFile().
Создание действий Open (открыть), Save (сохранить) и Save As (сохранить
взаимосвязанных пунктов меню. Мы используем цикл for для добавления (первоначально скрытых) действий из массива recentFileActions, а в конце добавляем действие exitAction.
Мы сохранили указатель на один из разделителей. Это позволяет нам скрывать этот разделитель (если файлы не использовались) или показывать его, поскольку мы не хотим отображать два разделителя, когда между ними ничего нет.
13 editMenu = menuBar()->addMenu(tr("&Edit"));
14 editMenu->addAction(cutAction);
15 editMenu->addAction(copyAction);
16 editMenu->addAction(pasteAction);
17 editMenu->addAction(deleteAction);
18 selectSubMenu = editMenu->addMenu(tr("&Select"));
19 selectSubMenu->addAction(selectRowAction);
20 selectSubMenu->addAction(selectColumnAction);
21 selectSubMenu->addAction(selectAllAction);
22 editMenu->addSeparator();