2009-2-9
创建菜单和工具栏
大部分现代GUI应用提供菜单、上下文菜单和工具栏。菜单使用户能够探究应用和学习如何做新的事情,而上下文菜单和工具栏提供了对频繁使用的功能的快速访问。
Qt通过其action概念简化了菜单和工具栏的编程。action可以被加入到任何菜单和工具栏上。在Qt中创建菜单和工具栏的步骤:
--创建并设置actions
--创建菜单并用actions构成
--创建工具栏并用actions构成
在电子表格应用中,action在createActions()方法中创建:
void MainWindow::createActions()
{
newAction = new QAction(tr("&New"), this);
newAction->setIcon(QIcon(":/images/new.png"));
newAction->setShortcut(QKeySequence::New);
newAction->setStatusTip(tr("Create a new spreadsheet file"));
connect(newAction, SIGNAL(triggered()), this, SLOT(newFile()));
New action有一个accelerator:_New,一个父亲(main window),一个图标,一个快捷键,一个状态tip. 许多窗口系统对特定actions有标准的快捷键,例如,New action 的快捷键是Ctrl+N. 通过使用适当的QKeySequence::StandardKey枚举值,Qt可确保提供特定平台上的标准快捷键。
我们将action的triggerer() signal连接到main window的private newFile() slot上。这个连接确保了当用户选择File|New菜单时,或者点击New工具栏按钮时,或者按下Ctrl+N时,newFile slot被调用。
Open,Save,Save As actions与New Action类似,不再介绍,下面直接到“当前打开文件”部分:
...
for (int i=0; i<MaxRecentFiles; ++i) {
recentFileActions[i] = new QAction(this);
recentFileActions[i]->setVisible(false);
connect(recentFileActions[i], SIGNAL(triggered()), this, SLOT(openRecentFile()));
}
创建时是隐藏的。
exitAction = new QAction(tr("E&xit"), this);
exitAction->setShortcut(tr("Ctrl+Q"));
exitAction->setStatusTip(tr("Exit the application"));
connect(exitAction, SIGNAL(triggered()), this, SLOT(close()));
exit Action与前面的稍微不同。没有标准的终止程序的键,所以我们明确定义了ctrl+Q键。另外一个不同是我们连接到了window的clost slot,这是Qt提供的slot.
...
selectAllAction = new QAction(tr("&All"), this);
selectAllAction->setShortcut(QKeySequence::SelectAll);
selectAllAction->setStatusTip("Select all the cells in th spreadsheet");
connect(selectAllAction, SIGNAL(triggered()), spreadsheet, SLOT(selectAll()));
其中的selectAll() slot是QTableWidget的父类QAbstractItemView提供的,所以我们不用自己实现。
...
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(setShowGrid(bool)));
Show Grid是一个checkable action. 在菜单上有一个检查标记,在工具栏中对应一个开关按钮。当action处于打开状态,Spreadsheet组件显示网格。
aboutQtAction = new QAction(tr("About &Qt"), this);
aboutQtAction->setStatusTip(tr("Show the Qt library's About box"));
connect(aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
}
调用的是QApplication的aboutQt() slot,通过qApp这个全局变量访问。
到此为止我们已经建立了actions,下面我们来创建菜单系统:
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);
在Qt中,menu是QMenu的实例。 addMenu函数创建一个QMenu widge,并将其加到menu bar上。 QMainWindow::menuBar()函数返回一个QMenuBar的指针。
我开始建立了一个File menu然后加上了New, Open, Save, Save As actions.我们插入了一个分隔符来为菜单项分组。
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);
增加Edit menu
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);
}
用同样的方式增加Tools, Options, Help菜单。其中在Options和help菜单间增加了一个分隔符,根据显示风格的不同,Help的位置会不同。
void MainWindow::createContextMenu()
{
spreadsheet->addAction(cutAction);
spreadsheet->addAction(copyAction);
spreadsheet->addAction(pasteAction);
spreadsheet->setContextMenuPolicy(Qt::ActionsContextMenu);
}
Qt widget也能够与QActions关联。为了提供一个上下文菜单,我们将一组需要的action增加到Spreadsheet组件上。上下文菜单通过点击右键调用。
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);
}
创建工具栏。