第5章 应用程序主窗口

5.1主窗口框架
QMainWindow类拥有自己的布局,包含以下组件:
菜单栏(QMenuBar)、工具栏(QToolBar)、中心部件(Central Widget) 、停靠窗口(QDockWidget)、状态栏(QStatusBar)
5.1.1 Qt资源系统、菜单栏和工具栏
可以在设计器中新建“Action”,Action可以用在“菜单”或工具栏中。
资源文件可以在往项目中添加新文件,选择Qt分类中的Qt Resource File,文件名称改为myimages。往项目中添加一个资源文件时,会自动往工程文件mymainwindow.pro中添加代码:
RESOURCES += \
myimages.qrc
如果是自己添加的已有的资源文件,要想在项目中使用,那么就要手动添加这行代码。
编写代码方式添加菜单
QMenu *editMenu = ui->menuBar->addMenu(tr("编辑(&E)")); //添加编辑菜单
QAction * action_Open = editMenu->addAction(QIcon(":/image/images/open.png"),tr("打开文件(&O)"));
action_open->setShortcut(QKeySequence("Ctrl + O")); //设置快捷键
ui->mainToolBar->addAction(action_open);//在工具栏中添加动作
使用ui->menuBar来获取菜单栏,使用ui->mainToolBar来获取工具栏。在菜单中的各种菜单项都是一个QAction类对象。
3.菜单栏
QMenuBar类提供一个水平的菜单栏,向其中添加QMenu类型的菜单对象,然后向弹出的菜单中添加QAction类型的动作对象作为菜单项。 间隔器,addSeparator()函数。还可以设置QAction的checkable属性。
动作组类QActionGroup类,包含一组动作QAction,是否只能有一个动作处于选中状态,这对于互斥型动作很有用。
4 工具栏
QToolBar有很多属性可以修改。
QToolButton * toolBtn = new QToolButton(this); //创建QToolButton
toolBtn->setText(tr("颜色"));
QMenu * colorMenu = new QMenu(this); //创建一个菜单
colorMenu->addAction(tr("红色"));
colorMenu->addAction(tr("绿色"));
toolBtn->setMenu(colorMenu);
toolBtn->setPopupMode(QToolButton::MenuButtonPopup); //设置弹出模式
ui->maitToolBar->addWidget(toolBtn);
QSpinBox * spinBox = new QSpinBox(this);
ui->mainToolBar->addWidget(spinBox);
当往工具栏中添加一个QAction类对象时就会自动创建了一个QToolButton实例。
5.1.2 中心部件
支持单文档部件和多文档部件。QMdiArea部件可以显示MDI多文档界面的区域,有效地管理多个窗口。QMdiArea中的子窗口QMdiSubWindow类提供,这类有自己的布局,一个标题栏和一个中心区域。
{
QTextEdit *edit = new QTextEdit(this);
QMdiSubWindow * child = ui->midArea->addSubWindow(edit);
child->setWindowTitle("多文档编辑器子窗口");
child->show();
}
5.1.3 Dock部件
QDockWidget类提供了这样一个部件,可以停靠在QMainWindow中,也可以是浮起来作为桌面顶级窗口,称为Dock部件或者停靠窗口。
5.1.4 状态栏
QStatusBar类显示状态信息,用addWidget()函数添加一个组件到状态栏上,addPermanentWidget()函数来添加一个可以显示信息的部件。QSizeGrip部件,用来调整窗口的大小,可以使用setSizeGripEnabled()函数禁用它。
在设计模式的相关部件上右击可以删除菜单栏、工具栏、状态栏。
5.1.5 自定义菜单
可以在工具栏中添加任意的部件。
实现自定义菜单,需要新建一个类,它继承自QWidgetAction类,并且在其中重新实现createWidget()函数。
QWidget * MyAction::createWidget(QWidget * parent)
{ //这里使用inherits()函数判断父部件是否是菜单或者工具栏
if(parent->inherits("QMenu") || parent-)
QSplitter * splitter = new QSplitter(parent);
QLabel * label = new QLabel;
label ->setText(tr("插入文本"));
splitter->addWidget(label);
splitter->addWidget(lineEdit);
return splitter;
}
MyAction * action = new MyAction;
QMenu * editMenu = ui->menuBar->addMenu(tr("编辑(&E)"));
editMenu->addAction(action);

浙公网安备 33010602011771号