(转)3.2 创建菜单和工具栏(Creating Menus and Toolbars)
2008-05-05 21:36
531 查看
很多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()));
[/code]
[/code]
Open,Save,SaveAs这些行为和New行为相似,所以略去这个部分说明recentFileActions的实现。
recentFileActions是一个action数组。里面的action被隐藏起来并连接到openRecentFile()槽函数。以后我们会讨论这些最近使用的文件是怎么可见的和被使用的。
selectAll() 槽是由QTableWidget的基类之一QAbstractItemView提供,我们不用再实现。
现在看看行为Options菜单里的ShowGrid。
ShowGrid是一个可选取的行为,菜单的旁边有一个选择的记号。在工具栏上这一项是个触发形式的工具条。当它被按下时,SpreadSheet组件显示一个网格。setShowGrid(bool)槽是从QTableWidget继承来。
ShowGrid和Auto_Recalculate是独立的行为。Qt的类QActionGroup也提供多选一的行为。
对About行为,使用QApplication对象的aboutQt()槽,通过全局变量qApp访问。
现在我们实现菜单函数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等菜单。QMenu::addMenu() 添加子菜单。
上下文菜单实现createContextMenu():
void MainWindow::createContextMenu()
{
spreadsheet->addAction(cutAction);
spreadsheet->addAction(copyAction);
spreadsheet->addAction(pasteAction);
spreadsheet->setContextMenuPolicy(Qt::ActionsContextMenu);
}
Qt的任何控件都与一系列行为相连,为实现上下文菜单,必须给控件添加期望的行为,并设置上下文菜单的策略为用这些行为来显示上下文菜单。右击该控件或按指定的键盘键来弹出上下文菜单。一个实现上下文菜单更好的方法是,重载QWidget::contextMenuEvent() 函数,创建一个QMenu控件,把它与期望的行为联系起,然后调用exec() 。
工具条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);
}
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,有一个加速键(New),一个父对象(主窗口),一个图标(new.png),一个快捷键(Ctrl+N),还有一个提示信息。我们连接这个action的triggered()信号和主窗口的私有槽函数newFile(),这个函数将在下一节实现。用户在选择了File|New菜单项,点击了New工具栏,或者在键盘敲了Ctrl+N时,newFile()被调用。
[/code]
[/code]
Open,Save,SaveAs这些行为和New行为相似,所以略去这个部分说明recentFileActions的实现。
recentFileActions是一个action数组。里面的action被隐藏起来并连接到openRecentFile()槽函数。以后我们会讨论这些最近使用的文件是怎么可见的和被使用的。
selectAll() 槽是由QTableWidget的基类之一QAbstractItemView提供,我们不用再实现。
现在看看行为Options菜单里的ShowGrid。
ShowGrid是一个可选取的行为,菜单的旁边有一个选择的记号。在工具栏上这一项是个触发形式的工具条。当它被按下时,SpreadSheet组件显示一个网格。setShowGrid(bool)槽是从QTableWidget继承来。
ShowGrid和Auto_Recalculate是独立的行为。Qt的类QActionGroup也提供多选一的行为。
对About行为,使用QApplication对象的aboutQt()槽,通过全局变量qApp访问。
现在我们实现菜单函数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等菜单。QMenu::addMenu() 添加子菜单。
上下文菜单实现createContextMenu():
void MainWindow::createContextMenu()
{
spreadsheet->addAction(cutAction);
spreadsheet->addAction(copyAction);
spreadsheet->addAction(pasteAction);
spreadsheet->setContextMenuPolicy(Qt::ActionsContextMenu);
}
Qt的任何控件都与一系列行为相连,为实现上下文菜单,必须给控件添加期望的行为,并设置上下文菜单的策略为用这些行为来显示上下文菜单。右击该控件或按指定的键盘键来弹出上下文菜单。一个实现上下文菜单更好的方法是,重载QWidget::contextMenuEvent() 函数,创建一个QMenu控件,把它与期望的行为联系起,然后调用exec() 。
工具条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);
}
相关文章推荐
- 3-2 创建菜单和工具条(Creating Menus and Toolbars)
- Creating and Using Menus on Windows Mobile Pocket PCs
- VS2010使用介绍创建可重用代码(一)---Creating and Using a Dynamic Link Library (C++)
- SDI MDI 中不创建 菜单, 工具栏等
- GTK+:“菜单” (menubar)和“工具栏”(toolbars)
- cocos2d-x 3.2创建文字菜单
- 【MFC入门】之六 MFC中创建应用程序资源之菜单资源plus快捷菜单 and 快捷键
- 通过CAA在CATIA中创建自己的工具栏按钮和菜单
- (转载)攻略:创建和使用动态链接库Walkthrough: Creating and Using a Static Library
- 创建模块化游戏(Creating Moddable Games with XML and Scripting Part I)代码阅读,关于整体架构!
- 创建模块化游戏(Creating Moddable Games with XML and Scripting Part I)代码阅读,关于整体架构!
- wxpython Menus and toolbars
- qt可停靠控件和工具栏(Dock Widgets and Toolbars)
- CAA创建自定义CATIA工具栏按钮和菜单
- 创建Annotation要素类(Creating annotation and dimension feature classes)
- MFC之在对话框创建菜单、工具栏、状态栏
- OpenERP Server Developers Documentation (Openerp服务器开发文档)之 Menus and Actions(菜单和动作)
- jsf in action 笔记:bean的创建和初始化(一)(3.3 Creating and initializing beans)--2008.04.12
- Android Wear 进阶 2.1 Creating and Running a Wearable App 创建和运行手表应用
- 使用vs2010创建可重用代码(二)Creating and Using a Static Library (C++)