QT学习教程(九)

创建菜单和工具条(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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风逐流wrx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值