3-2 创建菜单和工具条(Creating Menus and Toolbars)

    技术2022-05-11  78

    很多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(openRecentFile()));   }    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(setShowGrid(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菜单,给它添加了NewOpenSaveSaveAs行为。一个分割条(separator)把功能相近的菜单组合起来并和其他菜单分开。使用for循环添加recentFileActions行为数组,然后又添加了exitAction行为。

    我们保存了一个separator的指针,是因为这样可以控制它是否可见,如果最近文件没有时,这个separator就隐藏起来。

    相同的方式创建EditOptionHelp等菜单。

    上下文菜单实现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);}

    最新回复(0)