На этом шаге рассмотрим создание и настройку строки состояния.
Обычно строка состояния содержит два индикатора: положение текущей ячейки и формулу текущей ячейки. Полоса состояния также используется для вывода подсказок и других временных сообщений. На рис. 1 показаны разные состояния строки состояний.
Рис.1. Строка состояния приложения Электронная таблица
Для создания строки состояния в конструкторе MainWindow вызывается функция createStatusBar():
void MainWindow::createStatusBar() { /*Когда QStatusBar располагает виджеты индикаторов, он постарается обеспечить "идеальный" размер виджетов, заданный функцией QWidget::sizeHint(), и затем растянет виджеты, которые допускают растяжение, заполняя дополнительное пространство. Идеальный размер виджета зависит от его содержания и будет сам изменяться по мере изменения содержания. Чтобы предотвратить постоянное изменение размера индикатора ячейки, мы устанавливаем его минимальный размер на значение, достаточное для размещения в нем самого большого возможного текстового значения ("W999"), и добавляем еще немного пространства. Мы также устанавливаем его параметр выравнивания на значение AlignHCenter для выравнивания по центру текста в области индикатора*/ locationLabel = new QLabel(" W999 "); locationLabel->setAlignment(Qt::AlignHCenter); locationLabel->setMinimumSize(locationLabel->sizeHint()); formulaLabel = new QLabel; /*Мы добавили отступ для formulaLabel, чтобы указанный здесь текст отображался с небольшим смещением от левого края*/ formulaLabel->setIndent(3); /*Функция QMainWindow::statusBar() возвращает указатель на строку состояния. (Строка состояния создается при первом вызове функции statusBar). В качестве индикаторов состояния просто используются текстовые метки QLabel, текст которых изменяется по мере необходимости.При добавлении текстовых меток QLabel в строку состояния они автоматически становятся дочерними по отношению к строке состояния. Эти две текстовые метки занимают различное пространство. Индикатор ячейки занимает очень немного места, и при изменении размеров окна дополнительное пространство будет использовано для правого индикатора, где отображается формула ячейки. Это достигается путем установки фактора растяжения на 1 при вызове функции QStatusBar::addWidget() для формулы ячейки. При создании двух других индикаторов для индикатора позиции фактор растяжения по умолчанию равен 0, и поэтому он не будет растягиваться*/ statusBar()->addWidget(locationLabel); statusBar()->addWidget(formulaLabel, 1); /*Перед завершением функции мы соединяем два сигнала Spreadsheet с двумя слотами главного окна MainWindow: updateStatusBar() и spreadsheetModified()*/ connect(spreadsheet, SIGNAL(currentCellChanged(int, int, int, int)), this, SLOT(updateStatusBar())); connect(spreadsheet, SIGNAL(modified()), this, SLOT(spreadsheetModified())); /*В конце функции createStatusBar() этот слот используется как обычная функция для инициализации индикаторов. Это необходимо, поскольку Spreadsheet при запуске не генерирует сигнал currentCellChanged()*/ updateStatusBar(); }
Слот updateStatusBar() обновляет индикаторы расположения ячейки и формулы ячейки. Он вызывается при любом перемещении пользователем курсора ячейки на новую ячейку.
void MainWindow::updateStatusBar() { locationLabel->setText(spreadsheet->currentLocation()); formulaLabel->setText(spreadsheet->currentFormula()); }
Слот spreadsheetModified() обновляет все три индикатора для отражения ими текущего состояния приложения и устанавливает переменную modified на значение true. (Мы использовали переменную modified при реализации меню File для контроля несохраненных изменений). Слот spreadsheetModified() устанавливает свойство windowModified в значение true, обновляя строку заголовка. Эта функция обновляет также индикаторы расположения и формулы ячейки, чтобы они отражали текущее состояние.
void MainWindow::spreadsheetModified() { setWindowModified(true); updateStatusBar(); }
На следующем шаге рассмотрим реализацию меню File.