以第一个action为例:这个action为New,有一个加速键(N),一个父对象(主窗口),一个图标(new.jpg),一个快捷键(Ctrl+N),还有一个提示信息。我们连接这个action的triggered()信号和主窗口得私有槽函数newFile(),这个函数将在下一节实现。用户在选择了File|New菜单项,点击了New工具栏,或者在键盘敲了Ctrl+N时,newFile()被调用。 Open,Save,SaveAs这些行为和New行为相似,所以略去这个部分说明recentFileActions的实现。 recentFileActions是一个action数组。里面的action被隐藏起来并连接到openRecentFile()槽函数。以后我们会讨论这些最近使用的文件是怎么可见的和被使用的。 现在看看行为Options菜单里的ShowGrid。 ShowGrid是一个可选取的行为,菜单的旁边有一个选择的记号。在工具栏上这一项是个套索形式的工具条。当它被按下时,SpreadSheet组件显示一个网格。 ShowGrid和Auto_Recalculate是独立的行为。Qt的类QActionGroup也提供多选一的行为。 现在我们实现菜单函数createMenus() void MainWindow::createMenus() ... { fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->addAction(newAction); fileMenu->addAction(openAction); fileMenu->addAction(saveAction); fileMenu->addAction(saveAsAction); separatorAction = fileMenu->addSeparator(); for (int i = 0; i < MaxRecentFiles; ++i) fileMenu->addAction(recentFileActions[i]); fileMenu->addSeparator(); fileMenu->addAction(exitAction); editMenu = menuBar()->addMenu(tr("&Edit")); editMenu->addAction(cutAction); editMenu->addAction(copyAction); editMenu->addAction(pasteAction); editMenu->addAction(deleteAction); selectSubMenu = editMenu->addMenu(tr("&Select")); selectSubMenu->addAction(selectRowAction); selectSubMenu->addAction(selectColumnAction); selectSubMenu->addAction(selectAllAction); editMenu->addSeparator(); editMenu->addAction(findAction); editMenu->addAction(goToCellAction); toolsMenu = menuBar()->addMenu(tr("&Tools")); toolsMenu->addAction(recalculateAction); toolsMenu->addAction(sortAction); optionsMenu = menuBar()->addMenu(tr("&Options")); optionsMenu->addAction(showGridAction); optionsMenu->addAction(autoRecalcAction); menuBar()->addSeparator(); helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(aboutAction); helpMenu->addAction(aboutQtAction);}
在Qt中,菜单是类QMenu的实例。addMenu()函数创建一个带有文本的QMenu控件,把它添加的菜单条中。QMainWindow::menuBar()函数返回一个QMenuBar指针,当程序第一次调用menuBar()时,菜单条就被创建好了
我们首先新建了File菜单,给它添加了New,Open,Save,SaveAs行为。一个分割条(separator)把功能相近的菜单组合起来并和其他菜单分开。使用for循环添加recentFileActions行为数组,然后又添加了exitAction行为。
我们保存了一个separator的指针,是因为这样可以控制它是否可见,如果最近文件没有时,这个separator就隐藏起来。
相同的方式创建Edit,Option,Help等菜单。
上下文菜单实现createContextMenu():
void MainWindow::createContextMenu(){ spreadsheet -> addAction(cutAction); spreadsheet -> addAction(copyAction); spreadsheet -> addAction(pasteAction); spreadsheet -> setContextMenuPolicy(Qt::ActionsContextMenu);} 工具条createToolbars() void MainWindow::createToolBars(){ fileToolBar = addToolBar(tr( " &File " )); fileToolBar -> addAction(newAction); fileToolBar -> addAction(openAction); fileToolBar -> addAction(saveAction); editToolBar = addToolBar(tr( " &Edit " )); editToolBar -> addAction(cutAction); editToolBar -> addAction(copyAction); editToolBar -> addAction(pasteAction); editToolBar -> addSeparator(); editToolBar -> addAction(findAction); editToolBar -> addAction(goToCellAction);}