Разработка графического интерфейса с помощью библиотеки Qt3 | ||
---|---|---|
Пред. | Глава 3. Создание главного окна приложения | След. |
На этом мы заканчиваем описание настройки меню и панели инструментов, и переходим к строке состояния. В обычном режиме строка состояния содержит три индикатора: номер текущей ячейки, формула в текущей ячейке и MOD -- признак того, что файл был изменен. Но помимо этого строка состояния может использоваться для отображения подсказок и других сообщений.
Обычный режим.
Подсказка
Сообщение
Рисунок 3.13. Строка состояния.
Создается и настраивается строка состояния в функции createStatusBar(), которая вызывается из конструктора MainWindow:
void MainWindow::createStatusBar()
{
locationLabel = new QLabel(" W999 ", this);
locationLabel->setAlignment(AlignHCenter);
locationLabel->setMinimumSize(locationLabel->sizeHint());
formulaLabel = new QLabel(this);
modLabel = new QLabel(tr(" MOD "), this);
modLabel->setAlignment(AlignHCenter);
modLabel->setMinimumSize(modLabel->sizeHint());
modLabel->clear();
statusBar()->addWidget(locationLabel);
statusBar()->addWidget(formulaLabel, 1);
statusBar()->addWidget(modLabel);
connect(spreadsheet, SIGNAL(currentChanged(int, int)),
this, SLOT(updateCellIndicators()));
connect(spreadsheet, SIGNAL(modified()),
this, SLOT(spreadsheetModified()));
updateCellIndicators();
}
Она возвращает указатель на созданный ею компонент - строку
состояния. (Компонент строки состояния создается автоматически, при
первом вызове функции statusBar().)
Индикаторы -- это простые метки (QLabel),
текст в которых изменяется по мере необходимости. Во время создания,
меткам передается указатель на "владельца" (this), хотя в этом нет особой необходимости,
поскольку QStatusBar::addWidget()
"переподчиняет" их автоматически, назначая в качестве
"владельца" сам компонент строки состояния.Из рисунка 3.13 видно, что метки имеют различные размеры. Адрес ячейки и индикатор MOD -- самые короткие, а метка, отображающая действующую в ячейке формулу, самая длинная. Кроме того, при изменении размеров окна, все дополнительное пространство должно выделяться именно ей. Такое поведение достигается за счет указания фактора "stretch" (значение 1 в вызове QStatusBar::addWidget()). Для других двух меток этот фактор по-умолчанию принимается равным нулю, что означает фиксированный размер меток.
Когда QStatusBar размещает виджеты, он сначала выделяет место для "нерастягиваемых" компонентов (выделяя им "идеальный" размер, определяемый вызовом QWidget::sizeHint()), а затем все остальное пространство отдается "растягиваемым" виджетам. "Идеальный" размер, в свою очередь, зависит от содержимого виджетов и меняется при изменении содержимого. Задавая начальные значения меток ("W999" и "MOD"), мы тем самым определяем их минимально возможный размер.
В конце функции мы выполняем соединения между сигналами Spreadsheet к двум слотам MainWindow: updateCellIndicators() и spreadsheetModified().
void MainWindow::updateCellIndicators()
{
locationLabel->setText(spreadsheet->currentLocation());
formulaLabel->setText(" " + spreadsheet->currentFormula());
}
Слот updateCellIndicator() обновляет
метки, которые отображают адрес текущей ячейки и действующую в ней
формулу. Он вызывается всякий раз, когда пользователь переходит из
одной ячейки в другую. Кроме того, он вызывается как обычная функция, в
конце createStatusBar(), для инициализации
меток. Это совершенно необходимо, так как Spreadsheet не выдает сигнал currentChanged() во время инициализации.
void MainWindow::spreadsheetModified()
{
modLabel->setText(tr("MOD"));
modified = true;
updateCellIndicators();
}
Слот spreadsheetModified() обновляет
все три индикатора и устанавливает признак modified в true.
(Эта переменная используется для определения несохраненных изменений).
Пред. | В начало | След. |
Реализация меню "File". | На уровень выше | Использование диалогов. |