Шаг 168.
Библиотека Qt.
Создание и настройка строки состояния

    На этом шаге рассмотрим создание и настройку строки состояния.

    Обычно строка состояния содержит два индикатора: положение текущей ячейки и формулу текущей ячейки. Полоса состояния также используется для вывода подсказок и других временных сообщений. На рис. 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.




Предыдущий шаг Содержание Следующий шаг