Жасмин Бланшет - QT 4: программирование GUI на С++ стр 17.

Шрифт
Фон

QT 4: программирование GUI на С++

Рис. 3.7. Панели инструментов приложения Электронная таблица.

Создание и настройка строки состояния

После создания меню и панелей инструментов мы готовы приступить к созданию строки состояния приложения Электронная таблица.

Обычно строка состояния содержит два индикатора: положение текущей ячейки и формулу текущей ячейки. Полоса состояния также используется для вывода подсказок и других временных сообщений.

Для создания строки состояния в конструкторе MainWindow вызывается функция createStatusBar():

01 void MainWindow::createStatusBar()

02 {

03 locationLabel = new QLabel(" W999 ");

04 locationLabel->setAlignment(Qt::AlignHCenter);

05 locationLabel->setMinimumSize(locationLabel->sizeHint());

06 formulaLabel = new QLabel;

07 formulaLabel->setIndent(3);

08 statusBar()->addWidget(locationLabel);

09 statusBar()->addWidget(formulaLabel, 1);

10 connect(spreadsheet, SIGNAL(currentCellChanged(int, int, int, int)),

11 this, SLOT(updateStatusBar()));

12 connect(spreadsheet, SIGNAL(modified()),

13 this, SLOT(spreadsheetModified()));

14 updateStatusBar();

15 }

Функция QMainWindow::statusBar() возвращает указатель на строку состояния. (Строка состояния создается при первом вызове функции statusBar.) В качестве индикаторов состояния просто используются текстовые метки QLabel, текст которых изменяется по мере необходимости. Мы добавили отступ для formulaLabel, чтобы указанный здесь текст отображался с небольшим смещением от левого края. При добавлении текстовых меток QLabel в строку состояния они автоматически становятся дочерними по отношению к строке состояния.

Рис. 3.8 показывает, что эти две текстовые метки занимают различное пространство. Индикатор ячейки занимает очень немного места, и при изменении размеров окна дополнительное пространство будет использовано для правого индикатора, где отображается формула ячейки. Это достигается путем установки фактора растяжения на 1 при вызове функции QStatusBar::addWidget() для формулы ячейки при создании двух других индикаторов. Для индикатора позиции фактор растяжения по умолчанию равен 0, и поэтому он не будет растягиваться.

QT 4: программирование GUI на С++

Рис. 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 }

Слот newFile() вызывается при выборе пользователем пункта меню File | New или при нажатии кнопки New на панели инструментов. Закрытая функция okToContinue() задает пользователю вопрос относительно необходимости сохранения изменений ("Do you want to save your changes?" - Сохранить изменения?), если изменения до этого не были сохранены. Она возвращает значение true, если пользователь отвечает Yes или No (сохраняя документ при ответе Yes), и она возвращает значение false, если пользователь отвечает Cancel. Функция Spreadsheet::clear() очищает все ячейки и формулы электронной таблицы. Закрытая функция setCurrentFile() кроме установки закрытой переменной curFile и обновления списка недавно используемых файлов изменяет заголовок окна, отражая тот факт, что редактируемый документ не имеет заголовка.

01 bool MainWindow::okToContinue()

02 {

03 if (isWindowModified()) {

04 int r = QMessageBox::warning(this,

05 tr("Spreadsheet"), tr("The document has been modified.\n"

06 "Do you want to save your changes?"),

07 QMessageBox::Yes | QMessageBox::Default,

08 QMessageBox::No,

09 QMessageBox::Cancel | QMessageBox::Escape);

10 if (r == QMessageBox::Yes) {

11 return save();

12 } else if (r == QMessageBox::Cancel) {

13 return false;

14 }

15 }

16 return true;

17 }

B okToContinue() мы проверяем свойство windowModified. Если оно имеет значение true, мы выводим на экран сообщение, показанное на рис. 3.9. Окно сообщения содержит кнопки Yes, No и Cancel. Модификатор QMessageBox::Default делает Yes кнопкой, которая выбирается по умолчанию. Модификатор QMessageBox::Escape задает клавишу Esc в качестве синонима кнопки Cancel.

QT 4: программирование GUI на С++

Рис. 3.9. "Сохранить изменения?"

Вызов функции warning() на первый взгляд может показаться слишком сложным, но он имеет очень простой формат:

QMessageBox::warning(родительский объект, заголовок, сообщение, кнопка0, кнопка1, …);

QMessageBox содержит функции information(), question() и critical(), каждая из которых имеет собственную пиктограмму.

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке