Функция QMainWindow::statusBar() возвращает указатель на строку состояния. (Строка состояния создается при первом вызове функции statusBar.) В качестве индикаторов состояния просто используются текстовые метки QLabel, текст которых изменяется по мере необходимости. Мы добавили отступ для formulaLabel, чтобы указанный здесь текст отображался с небольшим смещением от левого края. При добавлении текстовых меток QLabel в строку состояния они автоматически становятся дочерними по отношению к строке состояния.
Рис. 3.8 показывает, что эти две текстовые метки занимают различное пространство. Индикатор ячейки занимает очень немного места, и при изменении размеров окна дополнительное пространство будет использовано для правого индикатора, где отображается формула ячейки. Это достигается путем установки фактора растяжения на 1 при вызове функции QStatusBar::addWidget() для формулы ячейки при создании двух других индикаторов. Для индикатора позиции фактор растяжения по умолчанию равен 0, и поэтому он не будет растягиваться.
Рис. 3.8. Строка состояния приложения Электронная таблица.
Когда QStatusBar располагает виджеты индикаторов, он постарается обеспечить «идеальный» размер виджетов, заданный функцией QWidget::sizeHint(), и затем растянет виджеты, которые допускают растяжение, заполняя дополнительное пространство. Идеальный размер виджета зависит от его содержания и будет сам изменяться по мере изменения содержания. Чтобы предотвратить постоянное изменение размера индикатора ячейки, мы устанавливаем его минимальный размер на значение, достаточное для размещения в нем самого большого возможного текстового значения («W999»), и добавляем еще немного пространства. Мы также устанавливаем его параметр выравнивания на значение AlignHCenter для выравнивания по центру текста в области индикатора.
Перед завершением функции мы соединяем два сигнала Spreadsheet с двумя слотами главного окна MainWindow: updateStatusBar() и spreadsheetModified().
01 void MainWindow::updateStatusBar()
02 {
03 locationLabel->setText(spreadsheet->currentLocation());
04 formulaLabel->setText(spreadsheet->currentFormula());
05 }
Слот updateStatusBar() обновляет индикаторы расположения ячейки и формулы ячейки. Он вызывается при любом перемещении пользователем курсора ячейки на новую ячейку. В конце функции createStatusBar() этот слот используется как обычная функция для инициализации индикаторов. Это необходимо, поскольку Spreadsheet при запуске не генерирует сигнал currentCellChanged().
06 void MainWindow::spreadsheetModified()
07 {
08 setWindowModified(true);
09 updateStatusBar();
10 }
Слот spreadsheetModified() обновляет все три индикатора для отражения ими текущего состояния приложения и устанавливает переменную modified на значение true. (Мы использовали переменную modified при реализации меню File для контроля несохраненных изменений.) Слот spreadsheetModified() устанавливает свойство windowModified в значение true, обновляя строку заголовка. Эта функция обновляет также индикаторы расположения и формулы ячейки, чтобы они отражали текущее состояние.
Реализация меню File
В данном разделе мы определим слоты и закрытые функции, необходимые для обеспечения работы меню File и для управления списком недавно используемых файлов.
01 void MainWindow::newFile()
02 {
03 if (okToContinue ())
04 {
05 spreadsheet->clear();
06 setCurrentFile("");
07 }
08 }