QT 4: программирование GUI на С++ | страница 40
Создание подкласса QMainWindow
Главное окно приложения создается в виде подкласса QMainWindow. Многие из представленных в главе 2 методов также подходят для построения главных окон, поскольку оба класса 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
>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. Возвращаемое значение игнорируется при выполнении слота в ответ на сигнал, но при вызове слота в качестве функции мы может воспользоваться возвращаемым значением, как это мы можем делать при вызове любой обычной функции С++.