Выбрать главу

25 toolsMenu = menuBar()->addMenu(tr("&Tools"));

26 toolsMenu->addAction(recalculateAction);

27 toolsMenu->addAction(sortAction);

28 optionsMenu = menuBar()->addMenu(tr("&Options"));

29 optionsMenu->addAction(showGridAction);

30 optionsMenu->addAction(autoRecalcAction);

31 menuBar()->addSeparator();

32 helpMenu = menuBar()->addMenu(tr("&Help"));

33 helpMenu->addAction(aboutAction);

34 helpMenu->addAction(aboutQtAction);

35 }

Подобным же образом мы создаем меню Tools, Options и Help (инструменты, опции и помощь). Мы вставляем разделитель между меню Options и Help. В системах Motif и CDE этот разделитель сдвигает меню Help вправо; в других случаях этот разделитель игнорируется.

Рис. 3.5. Полоса главного меню в стилях систем Motif и Windows.

01 void MainWindow::createContextMenu()

02 {

03 spreadsheet->addAction(copyAction);

04 spreadsheet->addAction(pasteAction);

05 spreadsheet->addAction(cutAction);

06 spreadsheet->setContextMenuPolicy(Qt::ActionsContextMenu);

07 }

Любой виджет в Qt может иметь связанный с ним список действий QAction. Для обеспечения в приложении контекстного меню мы добавляем необходимые нам действия в виджет Spreadsheet и устанавливаем политику контекстного меню виджета на отображение контекстного меню с этими действиями. Контекстные меню вызываются при щелчке правой клавишей мышки по виджету или при нажатии специальной клавиши клавиатуры, зависящей от платформы.

Рис. 3.6. Контекстное меню приложения Электронная таблица.

Более сложный способ обеспечения контекстного меню заключается в переопределении функции QWidget::contextMenuEvent(), создании виджета QMenu, заполнении его требуемыми действиями и вызове для него функции exec().

01 void Mainwindow::createToolBars()

02 {

03 fileToolBar = addToolBar(tr("&File"));

04 fileToolBar->addAction(newAction);

05 fileToolBar->addAction(openAction);

06 fileToolBar->addAction(saveAction);

07 editToolBar = addToolBar(tr("&Edif));

08 editToolBar->addAction(cutAction);

09 editToolBar->addAction(copyAction);

10 editToolBar->addAction(pasteAction);

11 editToolBar->addSeparator();

12 editToolBar->addAction(findAction);

13 editToolBar->addAction(goToCellAction);

14 }

Создание панелей инструментов очень похоже на создание меню. Мы создаем панель инструментов File и панель инструментов Edit. Как и меню, панель инструментов может иметь разделители.

Рис. 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, и поэтому он не будет растягиваться.