日常见到的应用程序,许多就是基于主窗口的,包括菜单栏,工具栏,等
主要介绍QMainWindow类为核心的主窗口框架
主窗口为建立应用程序用户界面提供了一个框架,Qt提供了QMainWindow和其他一些相关的类共同完成主窗口的管理。QMainWindow类拥有自己的布局(见图),包含以下组件:
①菜单栏(QMenuBar)
。菜单栏包含了一个下拉菜单项的列表,这些菜单项由QAction动作类实现。菜单栏位于主窗口的顶部,一个主窗口只能有一个菜单栏。
②工具栏(QToolBar)
。工具栏一般用于显示一些常用的菜单项目,也可以插入其他窗口部件,并且是可以移动的。一个主窗口可以拥有多个工具栏。
③中心部件(CentralWidget)
。在主窗口的中心区域可以放入一个窗口部件作为中心部件,是应用程序的主要功能实现区域。一个主窗口只能拥有一个中心部件。
④Dock部件(QDockWidget)
。Dock部件常被称为停靠窗口,因为可以停靠在中心部件的四周,用来放置一些部件来实现一些功能,就像个工具箱一样。一个主窗口可以拥有多个Dock部件。
⑤状态栏(QStatusBar)
。状态栏用于显示程序的一些状态信息,在主窗口的最底部。一个主窗口只能拥有一个状态栏。
本节知识可以在帮助索引中通过ApplicationMainWindow关键字查看,列出了所有与创建主窗口应用程序相关的类,也可以查看MainWindow示例程序。
新建widget项目mymainwindow,类名MainWindow,基类默认为QMainWindow,
打开ui
先添加菜单:
双击左上角的“在这里输入”,修改为“文件(&F)",这里要使用英文半角的括号(&F为加速键,alt+F激活该菜单)。
回车新的格子输入 新建文件(&N) (由于版本问题,不能输入中文,需要其他地方输入粘贴复制)
动作栏
运行程序按下alt+F就可以打开文件菜单,按下N就可以激活新建文件菜单,
但是必须是文件菜单在激活状态时按下N键才有效。
这也是加速键与快捷键的不同之处
使用资源管理器来进行添加
详细步骤见:QT–使用QT资料文件管理
先把要搞的图片文件放到一个文件夹中
添加前缀,添加文件
可以在帮助索引中查看The Qt Resource System关键字,这里介绍了Qt资源系统的相关内容。
前面在使用资源时添加的qrc资源文件其实是一个XML格式的文本文件,现在进入编辑模式,在myiages.qrc文件上右击,在弹出的级联菜单中选择“OpenWith→普通文本编辑器”,这时就会看到myimages.qrc的内容如下:
<RCC>
<qresource prefix="/myImages">
<file>images/filenew.png</file>
<file>images/fileopen.png</file>
<file>images/filesave.png</file>
<file>images/filesaveas.png</file>
<file>images/find.png</file>
</qresource>
</RCC>
这里指明了文件类型为RCC,表明是Qt资源文件。
然后是资源前缀,其下面罗列了添加的图片路径。
如果编写代码时要使用flienew.png图片,那么就可以将其路径指定为:
:/image/myImages/filenew.png
其中添加的前缀“/image”只是用来表明这是图片资源,可以改为别的名字,也可以为空。
前面在Resource Editor中进行图片添加操作,这种方式比较方便明了,也可以按照这里的格式使
用手写代码来添加图片。
往项目里添加一个资源文件时候,会自动往.pro中添加代码
RESOURCES += \
myimages.qrc
这表明项目中使用了资源文件myimages.qrc。在前面的过程中这是自动生成的,
但是如果是自己添加的已有的资源文件,要想在项目中使用,那么就要手动添加这行代码。
其实资源可以是任意类型的,不只是图片文件。
编译时会对加人的资源自动压缩,这也就是为什么有时生成的release版本可执行文件比添加进去的资源还要小的原因
前面在设计器中添加了文件菜单,然后添加了新建文件子菜单,其实这些都可以使用代码来实现。下面使用代码来添加一个菜单,在mainwindow. cpp文件的MainWindow类构造函数中添加代码
ui->setupUi(this);
QMenu *editMenu=ui->menubar->addMenu(tr("编辑(&E")); //添加编辑菜单
QAction *action_Open=editMenu->addAction( //添加打开菜单
QIcon(":/myImages/images/fileopen.png"),tr("打开文件(&O)"));
action_Open->setShortcut(QKeySequence("Ctrl+O"));
ui->mainToolBar->addAction(action_Open); //在工具栏中添加动作
这里使用ui->menuBar来获取QMainWindow的菜单栏,
使用ui->mainToolBar来获取QMainWindow的工具栏,
然后分别使用相应的函数添加菜单和动作。
工具栏在ui界面右键-添加工具栏—出现ToolBar
运行效果:
QMenuBar
类提供了一个水平的菜单栏,在QMainWindow
中可以直接获取默认的菜单栏,向其中添加QMenu类型的菜单对象,然后向弹出的菜单中添加QAction类型的动作对象作为菜单项。
QMenu中还提供了间隔器
,可以在设计器中向添加菜单那样直接添加间隔器,或者在代码中使用addSeparator()
函数来添加,它是一条水平线,可以将菜单进行分组,使得布局很整齐。
使用见下面
应用程序中很多普通的命令都是通过菜单来实现的,而我们也希望能将这些菜单命令放到工具栏中以方便使用。
QAction
就是这样一种命令动作,可以同时放在菜单和工具栏中。一个QAction动作包含了图标、菜单显示文本、快捷键、状态栏显示文本、“What’s This?”显示文本和工具提示文本。
这些都可以在构建QAction类对象时在构造函数中指定。
另外,还可以设置QAction的.checkable
属性,如果指定这个动作的checkable为true,那么选中这个菜单时就会在它的前面显示“√“之类的表示选中状态的符号;如果该菜单有图标,就会用线框将图标围住,用来表示该动作被选中了。
下面再介绍一个动作组QActionGroup类。它可以包含一组动作QAction,可以设置这组动作中是否只能有一个动作处于选中状态,这对于互异型动作很有用。
在前面程序的MainWindow类构造函数中继续添加如下代码:
QActionGroup *group = new QActionGroup(this); // 建立动作组
QAction *action_L = group->addAction(tr("左对齐(&L)")); // 向动作组中添加动作
action_L->setCheckable(true); // 设置动作checkable属性为true
QAction *action_R = group->addAction(tr("右对齐(&R)"));
action_R->setCheckable(true);
QAction *action_C = group->addAction(tr("居中(&C)"));
action_C->setCheckable(true);
action_L->setChecked(true); // 最后指定action_L为选中状态
editMenu->addSeparator(); // 向菜单中添加间隔器
editMenu->addAction(action_L);// 向菜单中添加动作
editMenu->addAction(action_R);
editMenu->addAction(action_C);
这里设置了一个动作组,然后设置“左对齐”动作为默认
因为最后重复了一遍 action_L->setChecked(true); // 最后指定action_L为选中状态,默认为左对齐选中
QToolBar提供了一组控件,可以移动的面板,前面已经可以看到将QAction对象添加到工具栏中,默认只是一个显示动作的图标
属性:toolButtonStyle
属性用来设置图标和相应文本的显示及其相对位置;movabel
属性用来设置状态栏是否可以移动;allowedArea
用来设置允许停靠的位置;iconsize
属性用来设置图标的大小;floatable
属性用来设置是否可以悬浮。
工具栏可以添加其他窗口部件,看一个例子:
头文件:
#include <QToolButton>
#include <QSpinBox>
构造函数:
//工具栏QToolButton
QToolButton* toolBtn =new QToolButton(this);
toolBtn->setText(tr("颜色"));
QMenu *colorMenu=new QMenu(this);//创建一个菜单
colorMenu->addAction(tr("红色"));
colorMenu->addAction(tr("绿色"));
toolBtn->setMenu(colorMenu); //添加菜单
toolBtn->setPopupMode(QToolButton::MenuButtonPopup);//设置弹出模式
ui->mainToolBar->addWidget(toolBtn);//向工具栏添加QToolButton按钮
QSpinBox *spinBox=new QSpinBox(this);//创建QSpinBox
//向工具栏添加QSpinBox部件
ui->mainToolBar->addWidget(spinBox);
toolBtn->setPopupMode(QToolButton::MenuButtonPopup);//设置弹出模式
官方文档
主窗口的中心区域可以放置一个中心部件,它一般是一个编辑器或者浏览器。这里支持单文档部件,也支持多文档部件。一般的,我们会在这里放置一个部件,然后使用布局管理器使其充满整个中心区域,并可以随着窗口的大小变化而变化。
下面在前面的程序中添加中心部件。在设计模式中,往中心区域拖入一个TextEdit,然后单击界面·按下Ctrl+G,使其处于一个栅格布局中。现在可以运行程序查看效果。
QTex tEdit是一个高级的WYSIWYG(所见即所得)浏览器和编辑器,支持富文本的处理,为用户提供了强大的文本编辑功能。而与QTextEdit对应的是QPlainTextEdit类,它提供了一个纯文本编辑器,这个类与QTextEdit类的很多功能都很相似,只不过无法处理富文本。还有一个QTextBrowser类,它是一个富文本浏览器,可以看作是QTextE dit的只读模式。因为这3个类的用法大同小异,所以以后的内容中只讲解QTextEdit类。
中心区域还可以使用多文档部件
Qt中的QMdiArea
部件就是用来提供一个可以显示MDI(MultipleDocumentInterface)多文档界面的区域,从而有效地管理多个窗口。
QMdiArea中的子窗口由QMdiSubWindow类提供 ,这个类有自己的布局,包含一个标题栏和一个中心区域,可以向它的中心区域添加部件。
下面更改前面的程序,在设计模式将前面添加的TextEdit部件删除,然后拖入个MDIArea部件。
在Action编辑器中的“新建文件”动作上右击,在弹出的级联菜单中选择“转到槽”,然后在弹出的对话框中选择triggered()触发信号,单击OK按钮后便转到mainwindow,cpp文件中的该信号的槽的定义处,更改如下
void MainWindow::on_action_New_triggered()
{
// 新建文本编辑器部件
QTextEdit *edit = new QTextEdit(this);
// 使用QMdiArea类的addSubWindow()函数创建子窗口,以文本编辑器为中心部件
QMdiSubWindow *child = ui->mdiArea->addSubWindow(edit);
child->setWindowTitle(tr("多文档编辑器子窗口"));
child->show();
}
这样点击新建文件时候触发槽,新建edit’文本编辑器,然后
新建一个child 类(QMdiSubWindow ) 然后使用addSubWindow函数新建子窗口(加上edit) 到mdiArea区域
实现了一个可悬浮窗口
Dock 部件- 一般用于存放些其他部件来实现特殊功能,就像一个工具箱。在主窗口中可以停靠在中心部件的四周,也可以悬浮起来被拖动到任意的地方,还可以被关闭或隐藏起来。一个Dock部件包含一个标题栏和一个内容区域,可以向Dock部件中放入任何部件。
打开设计模式拖入Dock widget
在属性栏里面修改Dock widget的标题为“工具箱”
还可以设置它的features 属性,包含是否可以关闭、移动和悬浮等;
还有allowedArea属性,用来设置可以停靠的区域。
下面在文件菜单中添加“显示Dock"菜单项,然后在Action编辑器中转到“显示
Dock"动作的触发信号triggered()的槽函数,更改如下:
先这样隐藏下窗口
//隐藏下Dcok
ui->dockWidget->setVisible(false);
再按下显示
void MainWindow::on_action_Dock_D_triggered()
{
ui->dockWidget->show();
}
效果:
当关闭x了这个Dock部件后,按下菜单项,也可以重新显示Dock了
QStatusBar
类提供了一个水平条部件,用来显示状态信息。
类似这种
QMainWindow 中默认提供了一个状态栏。
状态信息可以被分为3类:
临时信息,如一般的提示信息;正常信息,如显示页数和行号;
永久信息,如显示版本号或者日期。
可以使用showMessage ()
函数显示一个临时消息,它会出现在状态栏的最左边。
一般用addWidget()
函数添加一个QLabel到状态栏上,用于显示正常信息,它会生成到状态栏的最左边,可能被临时消息掩盖。
如果要显示永久信息,则要使用addPermanentWidget()
函数来添加一个如QLabel一样的可以显示信息的部件,它会生成在状态栏的最右端,不会被临时消息掩盖。
状态栏的最右端还有一个QSizeGrip
部件,用来调整窗口的大小,可以使用setSizeGripEnabled( )
函数来禁用它。
因为目前的设计器还不支持直接向状态栏中拖放部件,所以需要使用代码来生成。向mainwindow.cpp文件中的构造函数里继续添加代码:
//显示临时消息,显示2000毫秒即2秒
ui->statusBar->showMessage(tr("欢迎使用多文档编辑器"),2000);
// 创建标签,设置标签样式并显示信息,然后将其以永久部件的形式添加到状态栏
QLabel *permanent =new QLabel(this);
permanent->setFrameStyle(QFrame::Box|QFrame::Sunken); //设置标签frame属性
permanent->setText("@Halfup");
ui->statusBar->addPermanentWidget(permanent);
注意,这里需要添加#include < QLabel>头文件。
此时运行程序可以发现,“欢迎使用多文档编辑器”字符串在显示一.会儿后就自动消失了,而“@Halfup”一直显
示在状态栏最右端。
这是因为 ui->statusBar->showMessage是临时信息,且仅存在2s
而addPermanentWidget永久信息,不会被临时信息掩盖
到这里,主窗口的几个主要组成部分就介绍完了。
可以看到,一个QMainWindow类中默认提供了一个菜单栏、一个工具栏、一个中心区域和一个状态栏,而Dock部件是需要自己添加的。在设计模式的相关部件上右击可以删除菜单栏、工具栏和状态栏,也可以添加新的工具栏,当然这些操作也可以使用代码实现。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_35629971/article/details/121988812
内容来源于网络,如有侵权,请联系作者删除!