Qt---应用程序主窗口

x33g5p2x  于2021-12-20 转载在 其他  
字(7.2k)|赞(0)|评价(0)|浏览(375)

日常见到的应用程序,许多就是基于主窗口的,包括菜单栏,工具栏,等
主要介绍QMainWindow类为核心的主窗口框架

1 主窗口框架

主窗口为建立应用程序用户界面提供了一个框架,Qt提供了QMainWindow和其他一些相关的类共同完成主窗口的管理。QMainWindow类拥有自己的布局(见图),包含以下组件:

①菜单栏(QMenuBar)。菜单栏包含了一个下拉菜单项的列表,这些菜单项由QAction动作类实现。菜单栏位于主窗口的顶部,一个主窗口只能有一个菜单栏。

②工具栏(QToolBar)。工具栏一般用于显示一些常用的菜单项目,也可以插入其他窗口部件,并且是可以移动的。一个主窗口可以拥有多个工具栏。

③中心部件(CentralWidget)。在主窗口的中心区域可以放入一个窗口部件作为中心部件,是应用程序的主要功能实现区域。一个主窗口只能拥有一个中心部件。

④Dock部件(QDockWidget)。Dock部件常被称为停靠窗口,因为可以停靠在中心部件的四周,用来放置一些部件来实现一些功能,就像个工具箱一样。一个主窗口可以拥有多个Dock部件。

⑤状态栏(QStatusBar)。状态栏用于显示程序的一些状态信息,在主窗口的最底部。一个主窗口只能拥有一个状态栏。

本节知识可以在帮助索引中通过ApplicationMainWindow关键字查看,列出了所有与创建主窗口应用程序相关的类,也可以查看MainWindow示例程序。

官方实例MainWindow:

1.1 Qt资源系统,菜单栏和工具栏

新建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版本可执行文件比添加进去的资源还要小的原因

1.2 编写代码方式添加菜单

前面在设计器中添加了文件菜单,然后添加了新建文件子菜单,其实这些都可以使用代码来实现。下面使用代码来添加一个菜单,在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

运行效果:

1.3 菜单栏

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为选中状态,默认为左对齐选中

1.4 工具栏

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);//设置弹出模式
官方文档

2 中心部件

主窗口的中心区域可以放置一个中心部件,它一般是一个编辑器或者浏览器。这里支持单文档部件,也支持多文档部件。一般的,我们会在这里放置一个部件,然后使用布局管理器使其充满整个中心区域,并可以随着窗口的大小变化而变化。

下面在前面的程序中添加中心部件。在设计模式中,往中心区域拖入一个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区域

3 Dock部件

实现了一个可悬浮窗口
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了

4 状态栏

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部件是需要自己添加的。在设计模式的相关部件上右击可以删除菜单栏、工具栏和状态栏,也可以添加新的工具栏,当然这些操作也可以使用代码实现。

相关文章