创建菜单和工具条(Creating Menus and Toolbars)
很多GUI 程序都有菜单,上下文菜单,工具条等。用户通过菜单浏览程序提供的所有功能。上下文菜单和工具条能够使用户快速得到平时频繁使用得功能。Qt 使用“行为”(action)这个概念提供菜单和工具条。一个“行为(action)”是一个可以加入任何菜单或者工具条的项目。用 Qt 创建菜单和工具条需要如下步骤
1、 建立行为(action)
2、 创建菜单,并使它与一个行为关联
3、 创建工具条,并使它与一个行为关联
下面是SpreadSheet 程序中createActions()函数得实现:
void MainWindow::createActions()
{
newAction = new QAction(tr("&New"), this); newAction->setIcon(QIcon(":/images/new.png")); newAction->setShortcut(tr("Ctrl+N"));
newAction->setStatusTip(tr("Create a new spreadsheet file"));
connect(newAction, SIGNAL(triggered()), this, SLOT(newFile()));
//其他相关action
for (int i = 0; i < MaxRecentFiles; ++i)
{
recentFileActions[i] = new QAction(this);
recentFileActions[i]->setVisible(false);
connect(recentFileActions[i], SIGNAL(triggered()), this, SLOT(openRecentFi le()));
}
selectAllAction = new QAction(tr("&All"), this); selectAllAction->setShortcut(tr("Ctrl+A"));
selectAllAction->setStatusTip(tr("Select all the cells in the " "spreadsheet")); connect(selectAllAction, SIGNAL(triggered()), spreadsheet, SLOT(selectAll()));
showGridAction = new QAction(tr("&Show Grid"), this); showGridAction->setCheckable(true);
showGridAction->setChecked(spreadsheet->showGrid());
showGridAction->setStatusTip(tr("Show or hide the spreadsheet's ""grid")); connect(showGridAction, SIGNAL(toggled(bool)),spreadsheet, SLOT(setShow
Grid(bool)));
aboutQtAction = new QAction(tr("About &Qt"), this);
aboutQtAction->setStatusTip(tr("Show the Qt library's About box"));
connect(aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
}
以第一个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);
}