容器

容器(Containers)
在这里插入图片描述
各个控件的名称依次解释如下。

(1) Group Box:组框
(2) Scroll Area:滚动区域
(3) Tool Box:工具箱
(4) Tab Widget:标签小部件
(5) Stacked WIdget:堆叠小部件
(6) Frame:帧
(7) Widget:小部件
(8) MDI Area:MDI 区域((Multiple Document Interface)就是所谓的多文档界面)
(9) Dock Widget:停靠窗体部件

各种容器的解释如下:

QGroupBox 继承 QWidget。QGroupBox 为构建分组框提供了支持。分组框通常带有一个边框和一个标题栏,作为容器部件来使用,在其中可以布置各种窗口部件。布局时可用作一组控件的容器,但是需要注意的是,内部通常使用布局控件(如 QBoxLayout)进行布局。组框还提供键盘快捷方式,键盘快捷方式将键盘焦点移动到组框的一个子部件。

QScrollArea 继承 QAbstractScrollArea。滚动区域用于在框架中显示子部件的内容。如果小部件超过框架的大小,视图就会出现滚动条,以便可以查看子小部件的整个区域。
QToolBox 继承 QFrame。QToolBox 类提供了一列选项卡小部件项。工具箱是一个小部件,它显示一列选项卡在另一列的上面,当前项显示在当前选项卡的下面。每个选项卡在选项卡列中都有一个索引位置。选项卡的项是 QWidget。
QTabWidget 继承 QWidget。abWidget 类提供了一组选项卡(多页面)小部件。QTabWidget主要是用来分页显示的,每一页一个界面,众多界面公用一块区域,节省了界面大小,很方便的为用户显示更多的信息。
QStackedWidget 继承 QFrame。QStackedWidget 类提供了一个小部件堆栈,其中一次只能看到一个小部件,与 QQ 的设置面板类似。QStackedWidget 可用于创建类似于 QTabWidget 提供的用户界面。它是构建在 QStackedLayout 类之上的一个方便的布局小部件。常与 QListWidget搭配使用,效果如下图,左边的是 QListWidget 列表,右边的是 QStackedWidget。他们一般与信号槽连接,通过点击左边的 QListWidget 列表,使用信号槽连接后,就可以让右边的QStackedWidget 显示不同的内容,每次显示一个 widget 小部件。
QWidget 类是所有用户界面对象的基类(如 QLabel 类继承QFrame 类,而 QFrame 类又继承于 QWidget 类)。Widget 是用户界面的基本单元:它从窗口系统接收鼠标,键盘和其他事件,并在屏幕上绘制自己。每个 Widget 都是矩形的,它们按照 Z-order 进行排序。 注:Z-order是重叠二维对象的顺序,例如堆叠窗口管理器中的窗口。典型的 GUI 的特征之一是窗口可能重叠,使得一个窗口隐藏另一个窗口的一部分或全部。当两个窗口重叠时,它们的 Z 顺序确定哪个窗口出现在另一个窗口的顶部。理解:术语"z-order"指沿着 z 轴物体的顺序。三维坐标轴中 x横轴,y 数轴,z 上下轴。可以将 gui 窗口视为平行与显示平面的一系列平面。因此,窗口沿着z 轴堆叠。所以 z-order 指定了窗口的前后顺序。就像您桌面上的一叠纸一样,每张纸是一个窗口,桌面是您的屏幕,最上面的窗口 z 值最高。QWidget 不是一个抽象类,它可以用作其他 Widget的容器,并很容易作为子类来创建定制 Widget。它经常用于创建、放置和容纳其他的 Widget窗口。由上可知,QWidget 一般用于容纳其他 Widget 窗口,其属性和方法相当的多,对于初学者,我们通常只用它来作可以容纳其他窗口的容器,还会用来接收鼠标,键盘和其他事件等。
QMdiArea 继承 QAbstractScrollArea。QMdiArea 小部件提供一个显示 MDI 窗口的区域。QMdiArea的功能本质上类似于MDI窗口的窗口管理器。大多数复杂的程序,都使用MDI框架,在 Qt designer 中可以直接将控件 MDI Area 拖入使用。
QDockWidget 继承 QWidget。QDockWidget 类提供了一个小部件,可以停靠在 QMainWindow 内,也可以作为桌面的顶级窗口浮动。QDockWidget 提供了停靠部件的概念,也称为工具面板或实用程序窗口。停靠窗口是放置在 QMainWindow 中央窗口附近的停靠窗口部件区域中的辅助窗口。停靠窗口可以被移动到当前区域内,移动到新的区域,并由终端用户浮动(例如,不停靠)。QDockWidget API 允许程序员限制 dock widget 的移动、浮动和关闭能力,以及它们可
以放置的区域。QDockWidget 的初始停靠区域有Qt.BottomDockWidgetArea(底部停靠)、Qt.LeftDockWidgetArea(左边停靠、Qt.RightDockWidgetArea(右边停靠)、Qt.TopDockWidgetArea(顶部停靠)和Qt.NoDockWidgetArea(不显示 Widget)。

在前面某些小节里已经有使用过本小节的控件,例如 QWidget 小部件。下面将上面列出的控件进行进一步的解释与运用。

一、QGroupBox

1. 控件简介

QGroupBox 小部件提供一个带有标题的组框框架。一般与一组或者是同类型的部件一起使用。

2. 用法示例

例 33_qgroupbox,组框示例(难度:简单),使用 3 个 QRadioButton 单选框按钮,与QVBoxLayout(垂直布局)来展示组框的基本使用。

在新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可。项目新建完成如下图。
在这里插入图片描述
在头文件“mainwindow.h”具体代码如下。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QRadioButton>
#include <QGroupBox>
#include <QVBoxLayout>

class MainWindow : public QMainWindow
{
	Q_OBJECT

public:
	MainWindow( QWidget *parent = nullptr );
	~MainWindow();

private:
	/* 声明对象 */
	QGroupBox	*groupBox;
	QVBoxLayout	*vBoxLayout;
	QRadioButton	*radioButton[3];
};
#endif  /* MAINWINDOW_H */

在源文件“mainwindow.cpp”具体代码如下。

#include "mainwindow.h"
#include <QList>

MainWindow::MainWindow( QWidget *parent )
	: QMainWindow( parent )
{
	/* 设置主窗体位置与大小 */
	this->setGeometry( 0, 0, 800, 480 );
	/* 以标题为“QGroupBox 示例”实例化 groupBox 对象 */
	groupBox = new QGroupBox( tr( "QGroupBox 示例" ), this );
	groupBox->setGeometry( 300, 100, 300, 200 );

	vBoxLayout = new QVBoxLayout();

	/* 字符串链表 */
	QList <QString>list;
	list << "选项一" << "选项二" << "选项三";
	for ( int i = 0; i < 3; i++ )
	{
		radioButton[i] = new QRadioButton();
		radioButton[i]->setText( list[i] );
		/* 在 vBoxLayout 添加 radioButton */
		vBoxLayout->addWidget( radioButton[i] );
	}
	/* 添加一个伸缩量 1 */
	vBoxLayout->addStretch( 1 );
	/* vBoxLayout 布局设置为 groupBox 布局 */
	groupBox->setLayout( vBoxLayout );
}


MainWindow::~MainWindow()
{
}

在源文件“main.cpp”具体代码由新建项目时生成,无改动。

3. 运行效果

程序编译运行的结果如下,可以看到 radioButton 有规则的排布在 groupBox 组框里面。
在这里插入图片描述

二、QScrollArea

1. 控件简介

QScrollArea 类提供到另一个小部件的滚动视图。

2. 用法示例

例 34_qscrollarea 滚动视图(难度:简单),使用一个 Label 标签,将 Label 标签设置为一张图片,并把 Label 标签放置于滚动区域内,此时图片应要大于滚动区域才会出现滚动条。

在新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可。项目新建完成如下图。
在这里插入图片描述
在头文件“mainwindow.h”具体代码如下。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QScrollArea>
#include <QLabel>

class MainWindow : public QMainWindow
{
	Q_OBJECT

public:
	MainWindow( QWidget *parent = nullptr );
	~MainWindow();

private:
	/* 定义 QScrollArea 对象 */
	QScrollArea	*scrollArea;
	QLabel		*label;
};
#endif  /* MAINWINDOW_H */

在源文件“mainwindow.cpp”具体代码如下。

#include "mainwindow.h"

MainWindow::MainWindow( QWidget *parent )
	: QMainWindow( parent )
{
	this->setGeometry( 0, 0, 800, 480 );

	scrollArea = new QScrollArea( this );
	/* 设置滚动区域为 700*380 */
	scrollArea->setGeometry( 50, 50, 700, 380 );

	label = new QLabel();
	/* label 显示的 lantingxu.png 图片分辨率为 1076*500 */
	QImage image( ":/images/lantingxu.png" );
	label->setPixmap( QPixmap::fromImage( image ) );

	scrollArea->setWidget( label );
}


MainWindow::~MainWindow()
{
}

在源文件“main.cpp”具体代码由新建项目时生成,无改动。

3. 运行效果

程序编译运行的结果如下,由于图片的大小大于滚动区域的大小,所以在滚动区域出现了滚动条,可以拖动滚动条来查看这张图片其余部分。
在这里插入图片描述

三、QToolBox

1. 控件简介

QToolBox(工具盒类)提供了一种列状的层叠窗体,中文译为工具箱,类似抽屉。

2. 用法示例

例 35_qtoolbox,QQ 好友面板之 QToolBox(难度:简单),本例将使用到前面的知识QGroupBox 组框与 QBoxLayout 布局管理。前面我们已经学过 QGroupBox 组框和学过QBoxLayout。有了前面的基础,那么去理解本例就会快很多。

本例思路:使用 6 个 QToolButton 分成 2 组,使用垂直布局将 QToolButton 的 2 组排布好,然后添加到 2 组 QGroupBox 组框,再把 2 组 QGroupBox 组框作为子项添加到 QToolBox。

在新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可。项目新建完成,如下图。
在这里插入图片描述
在头文件“mainwindow.h”具体代码如下。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QToolBox>
#include <QGroupBox>
#include <QToolButton>
#include <QVBoxLayout>

class MainWindow : public QMainWindow
{
	Q_OBJECT

public:
	MainWindow( QWidget *parent = nullptr );
	~MainWindow();

private:
	/* 声明对象 */
	QToolBox	*toolBox;
	QGroupBox	*groupBox[2];
	QVBoxLayout	*vBoxLayout[2];
	QToolButton	*toolButton[6];
};
#endif  /* MAINWINDOW_H */

在源文件“mainwindow.cpp”具体代码如下。

#include "mainwindow.h"

MainWindow::MainWindow( QWidget *parent )
	: QMainWindow( parent )
{
	this->setGeometry( 0, 0, 800, 480 );

	toolBox = new QToolBox( this );
	toolBox->setGeometry( 300, 50, 200, 250 );
	/* 设置 toolBox 的样式,此处设置为 30%不透明度的黑色 */
	toolBox->setStyleSheet( "QToolBox {background-color:rgba(0, 0, 0,
30%);}" );

	for ( int i = 0; i < 2; i++ )
	{
		vBoxLayout[i]	= new QVBoxLayout();
		groupBox[i]	= new QGroupBox( this );
	}

	/* 字符串链表 */
	QList <QString>strList;
	strList << "李白" << "王照君" << "李元芳" << "程咬金" << "钟馗" << "上官婉儿";

	/* 字符串图标链表 */
	QList <QString>iconsList;
	iconsList	<< ":/icons/libai" << ":/icons/wangzhaojun"
			<< ":/icons/liyuanfang" << ":/icons/chengyaojin"
			<< ":/icons/zhongkui" << ":/icons/shangguanwaner";

	for ( int i = 0; i < 6; i++ )
	{
		toolButton[i] = new QToolButton();
		/* 设置 toolButton 图标 */
		toolButton[i]->setIcon( QIcon( iconsList[i] ) );
		/* 设置 toolButton 的文本 */
		toolButton[i]->setText( strList[i] );
		/* 设置 toolButton 的大小 */
		toolButton[i]->setFixedSize( 150, 40 );
		/* 设置 toolButton 的 setToolButtonStyle 的样式 */
		toolButton[i]->setToolButtonStyle(
			Qt::ToolButtonTextBesideIcon
			);
		if ( i < 3 )
		{
			/* 将 toolButton 添加到时垂直布局 */
			vBoxLayout[0]->addWidget( toolButton[i] );
			/* 添加一个伸缩量 1 */
			vBoxLayout[0]->addStretch( 1 );
		} else {
			vBoxLayout[1]->addWidget( toolButton[i] );
			vBoxLayout[1]->addStretch( 1 );
		}
	}
	/* 将垂直布局的内容添加到组框 groupBox */
	groupBox[0]->setLayout( vBoxLayout[0] );
	groupBox[1]->setLayout( vBoxLayout[1] );

	/* 将组框加入 QToolBox 里 */
	toolBox->addItem( groupBox[0], "我的好友" );
	toolBox->addItem( groupBox[1], "黑名单" );
}


MainWindow::~MainWindow()
{
}

在源文件“main.cpp”具体代码由新建项目时生成,无改动。

3. 运行效果

程序编译运行的结果如下,本次使用 QToolButool 作为 QGroupBox 的子项,也可以使用其他 QWidget 小部件,如 QWidget 等。(注意本程序在 linux 运行效果如下,若如在 Windows 下,可能 QToolBox 的显示样式不一样)。点击“我的好友”列表,则会出现好友列表,点击“黑名单”则会出现黑名单列表。
在这里插入图片描述

四、QTabWidget

1. 控件简介

QTabWidget 继承 QWidget,QTabWidget 类提供了一组选项卡(多页面)小部件。QTabWidget 主要是用来分页显示的,每一页一个界面,众多界面公用一块区域,节省了界面大小,很方便的为用户显示更多的信息。类似浏览器的多标签页面,所以这个控件在实际项目中也会经常用到。

2. 用法示例

例 36_ qtabwidget ,标题栏多页面切换(难度:简单),本例创建 3 个页面,每个页面里有一个 Label 标签部件,点击每个页面的选项卡则会切换到不同的页面上。

在新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可。项目新建完成,并添加了几张资源图片如下图。
在这里插入图片描述
在头文件“mainwindow.h”具体代码如下。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTableWidget>
#include <QHBoxLayout>
#include <QLabel>

class MainWindow : public QMainWindow
{
	Q_OBJECT

public:
	MainWindow( QWidget *parent = nullptr );
	~MainWindow();

private:
	/* 声明对象 */
	QWidget		*widget;
	QTabWidget	*tabWidget;
	QHBoxLayout	*hBoxLayout;
	QLabel		*label[3];
};
#endif  /* MAINWINDOW_H */

在源文件“mainwindow.cpp”具体代码如下。

#include "mainwindow.h"

MainWindow::MainWindow( QWidget *parent )
	: QMainWindow( parent )
{
	this->setGeometry( 0, 0, 800, 480 );

	widget = new QWidget( this );
	/* 居中 */
	this->setCentralWidget( widget );

	/* 多页面小部件 */
	tabWidget = new QTabWidget();

	/* 水平布局实例化 */
	hBoxLayout = new QHBoxLayout();
	QList <QString>strLabelList;
	strLabelList << "标签一" << "标签二" << "标签三";

	QList <QString>strTabList;
	strTabList << "页面一" << "页面二" << "页面三";

	QList <QString>iconList;
	iconList	<< ":/icons/icon1"
			<< ":/icons/icon2"
			<< ":/icons/icon3";

	for ( int i = 0; i < 3; i++ )
	{
		label[i] = new QLabel();
		/* 设置标签文本 */
		label[i]->setText( strLabelList[i] );
		/* 标签对齐方式(居中) */
		label[i]->setAlignment( Qt::AlignCenter );
		/* 添加页面 */
		tabWidget->addTab( label[i],
				   QIcon( iconList[i] ),
				   strTabList[i]
				   );
	}
	/* 是否添加关闭按钮 */
	/* tabWidget->setTabsClosable(true); */
	/* 将 tabWidget 水平直排布 */
	hBoxLayout->addWidget( tabWidget );
	/* 将垂直布局设置到 widget */
	widget->setLayout( hBoxLayout );
}


MainWindow::~MainWindow()
{
}

源文件“main.cpp”具体代码由新建项目时生成,无改动。

3. 运行效果

程序编译运行的结果如下,点击不同页面的选项卡则会切换到不同的页面上。本例还可拓展使用 void setTabsClosable(bool closeable)函数在选项卡后加一个关闭按钮,再连接信号槽实现关闭页面的操作。本例就不再添加代码了,比较简单。
在这里插入图片描述

五、QStackedWidget

1. 控件简介

QStackedWidget 继承 QFrame。QStackedWidget 类提供了一个小部件堆栈,其中一次只能看到一个小部件,与 QQ 的设置面板类似。

QStackedWidget 可 用 于创 建 类 似 于 QTabWidget 提 供 的 用 户 界 面 。 它 是 构 建 在QStackedLayout 类之上的一个方便的布局小部件。常与 QListWidget 搭配使用,效果如下图,左边的是 QListWidget 列表,右边的是 QStackedWidget。他们一般与信号槽连接,通过点击左边的 QListWidget 列表,使用信号槽连接后,就可以让右边的 QStackedWidget 显示不同的内容,每次显示一个 widget 小部件。

在这里插入图片描述

2. 用法示例

例 37_qstackedwidget,列表栏多页面切换(难度:简单),本例创建 3 个堆栈页面,每个页面里有一个 Label 标签部件,点击每个列表的不同项则会切换到不同的页面上。

在新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可。项目新建完成,如下图。
在这里插入图片描述
在头文件“mainwindow.h”具体代码如下。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStackedWidget>
#include <QHBoxLayout>
#include <QListWidget>
#include <QLabel>

class MainWindow : public QMainWindow
{
	Q_OBJECT

public:
	MainWindow( QWidget *parent = nullptr );
	~MainWindow();

private:
	/* widget 小部件 */
	QWidget *widget;
	/* 水平布局 */
	QHBoxLayout *hBoxLayout;
	/* 列表视图 */
	QListWidget *listWidget;
	/* 堆栈窗口部件 */
	QStackedWidget *stackedWidget;
	/* 3 个标签 */
	QLabel *label[3];
};
#endif  /* MAINWINDOW_H */

在源文件“mainwindow.cpp”具体代码如下。

#include "mainwindow.h"

MainWindow::MainWindow( QWidget *parent )
	: QMainWindow( parent )
{
	this->setGeometry( 0, 0, 800, 480 );

	/* widget 小部件实例化 */
	widget = new QWidget( this );

	/* 设置居中 */
	this->setCentralWidget( widget );

	/* 垂直布局实例化 */
	hBoxLayout = new QHBoxLayout();

	/* 堆栈部件实例化 */
	stackedWidget = new QStackedWidget();

	/* 列表实例化 */
	listWidget = new QListWidget();

	QList <QString>strListWidgetList;
	strListWidgetList << "窗口一" << "窗口二" << "窗口三";

	for ( int i = 0; i < 3; i++ )
	{
		/* listWidget 插入项 */
		listWidget->insertItem(
			i,
			strListWidgetList[i]
			);
	}

	QList <QString>strLabelList;
	strLabelList << "标签一" << "标签二" << "标签三";

	for ( int i = 0; i < 3; i++ )
	{
		label[i] = new QLabel();
		/* 设置标签文本 */
		label[i]->setText( strLabelList[i] );
		/* 标签对齐方式(居中) */
		label[i]->setAlignment( Qt::AlignCenter );
		/* 添加页面 */
		stackedWidget->addWidget( label[i] );
	}

	/* 设置列表的最大宽度 */
	listWidget->setMaximumWidth( 200 );
	/* 添加到水平布局 */
	hBoxLayout->addWidget( listWidget );
	hBoxLayout->addWidget( stackedWidget );

	/* 将 widget 的布局设置成 hboxLayout */
	widget->setLayout( hBoxLayout );


	/* 利用 listWidget 的信号函数 currentRowChanged()与
	 * 槽函数 setCurrentIndex(),进行信号与槽连接
	 */
	connect( listWidget, SIGNAL( currentRowChanged( int ) ),
		 stackedWidget, SLOT( setCurrentIndex( int ) ) );
}


MainWindow::~MainWindow()
{
}

在源文件“main.cpp”具体代码由新建项目时生成,无改动。

3. 运行效果

程序编译运行的结果如下,点击列表视图的不同的项会切换到不同的页面上。
在这里插入图片描述

六、QFrame

1. 控件简介

在前面 三 已经举过例子

2. 用法示例

3. 运行效果

七、QWidget

1. 控件简介

QWidget 类是所有用户界面对象的基类(如 QLabel 类继承于 QFrame 类,而 QFrame 类又继承于 QWidget 类)。Widget 是用户界面的基本单元:它从窗口系统接收鼠标,键盘和其他事件,并在屏幕上绘制自己。每个 Widget 都是矩形的,它们按照 Z-order 进行排序。

注:Z-order 是重叠二维对象的顺序,例如堆叠窗口管理器中的窗口。典型的 GUI 的特征之一是窗口可能重叠,使得一个窗口隐藏另一个窗口的一部分或全部。 当两个窗口重叠时,它们的 Z 顺序确定哪个窗口出现在另一个窗口的顶部。

理解:术语"z-order"指沿着 z 轴物体的顺序。三维坐标轴中 x 横轴,y 数轴,z 上下轴。可以将 gui 窗口视为平行与显示平面的一系列平面。因此,窗口沿着 z 轴堆叠。所以 z-order 指定了窗口的前后顺序。就像您桌面上的一叠纸一样,每张纸是一个窗口,桌面是您的屏幕,最上面的窗口 z 值最高。

QWidget 不是一个抽象类,它可以用作其他 Widget 的容器,并很容易作为子类来创建定制Widget。它经常用于创建、放置和容纳其他的 Widget 窗口。

上面这么多例子都有用到 QWidget,如上面的 五

2. 用法示例

3. 运行效果

八、QMdiArea

1. 控件简介

QMdiArea 继承 QAbstractScrollArea。QMdiArea 小部件提供一个显示 MDI 窗口的区域。QMdiArea的功能本质上类似于MDI窗口的窗口管理器。大多数复杂的程序,都使用MDI框架,在 Qt designer 中可以直接将控件 MDI Area 拖入使用。

2. 用法示例

例 38_qmdiarea,父子窗口(难度:简单),本例创建一个 MDI Area 区域,使用一个按钮,每单击按钮时,就会在 MDI Area 区域新建一个 MdiSubWindow 窗口。

在新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可。项目新建完成,如下图。
在这里插入图片描述
在头文件“mainwindow.h”具体代码如下。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMdiSubWindow>
#include <QMdiArea>
#include <QPushButton>

class MainWindow : public QMainWindow
{
	Q_OBJECT

public:
	MainWindow( QWidget *parent = nullptr );
	~MainWindow();

private:
	/* Mdi Area 区域对象 */
	QMdiArea *mdiArea;
	/* MdiSubWindow 子窗口对象 */
	QMdiSubWindow *newMdiSubWindow;
/* 用作点击创建新的窗口 */
	QPushButton *pushButton;

private slots:
	/* 按钮槽函数 */
	void creat_newMdiSubWindow();
};
#endif  /* MAINWINDOW_H */

在源文件“mainwindow.cpp”具体代码如下

#include "mainwindow.h"

MainWindow::MainWindow( QWidget *parent )
	: QMainWindow( parent )
{
	/* 设置窗口的显示位置与大小 */
	this->setGeometry( 0, 0, 800, 480 );
	pushButton = new QPushButton( "新建窗口", this );
	pushButton->setGeometry( 0, 30, 100, 30 );

	mdiArea = new QMdiArea( this );
	/* 设置 MDI Area 区域大小 */
	mdiArea->setGeometry( 100, 30, 700, 430 );
	/* 连接信号槽 */
	connect( pushButton, SIGNAL( clicked() ),
		 this, SLOT( creat_newMdiSubWindow() ) );
}


void MainWindow::creat_newMdiSubWindow()
{
	newMdiSubWindow = new QMdiSubWindow();
	newMdiSubWindow->setWindowTitle( "新建窗口" );


	/* 如果窗口设置了 Qt::WA_DeleteOnClose 这个属性,
	 * 在窗口接受了关闭事件后,Qt 会释放这个窗口所占用的资源
	 */
	newMdiSubWindow->setAttribute( Qt::WA_DeleteOnClose );

	/* 添加子窗口 */
	mdiArea->addSubWindow( newMdiSubWindow );
	/* 显示窗口,不设置时为不显示 */
	newMdiSubWindow->show();
	/* 自适应窗口 */
	newMdiSubWindow->sizePolicy();
	/* 以级联的方式排列所有窗口 */
	/* mdiArea->cascadeSubWindows(); */
	/* 以平铺方式排列所有窗口 */
	mdiArea->tileSubWindows();
}


MainWindow::~MainWindow()
{
}

在源文件“main.cpp”具体代码由新建项目时生成,无改动。

3. 运行效果

程序编译运行的结果如下,当点击新建窗口按钮时,在 MDI Area 区域里新建了一个窗口标题为“新建窗口”窗口,下图为点击多次新建窗口的效果。本例使用了一个按钮,进行了新建窗口操作,其他功能例如添加删除按钮等,读者可以自行添加。本文在新建窗口里的内容为空,newMdiSubWindow 可以使用 setWidget(QWidget *widget)方法添加内容,如添加前面所学过的 QLineEdit 等。

在这里插入图片描述

九、QDockWidget

1. 控件简介

QDockWidget继承QWidget。QDockWidget类提供了一个小部件,可以停靠在QMainWindow内,也可以作为桌面的顶级窗口浮动。

QDockWidget 提供了停靠部件的概念,也称为工具面板或实用程序窗口。停靠窗口是放置在 QMainWindow 中央窗口附近的停靠窗口部件区域中的辅助窗口。停靠窗口可以被移动到当前区域内,移动到新的区域,并由终端用户浮动(例如,不停靠)。QDockWidget API 允许程序员限制 dock widget 的移动、浮动和关闭能力,以及它们可以放置的区域。QDockWidget 的初始停靠区域有 Qt.BottomDockWidgetArea(底部停靠)、Qt.LeftDockWidgetArea(左边停靠、;
Qt.RightDockWidgetArea ( 右 边 停 靠 )、 Qt.TopDockWidgetArea ( 顶 部 停 靠 ) 和
Qt.NoDockWidgetArea(不显示 Widget)。

2. 用法示例

例 39_qdockwidget,停靠窗口(难度:简单),本例创建一个停靠窗口,在停靠窗口里添加文本编辑框,并且把这个停靠窗口放置到 QMainWindow 的顶部。

在新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可。项目新建完成,如下图。
在这里插入图片描述
在头文件“mainwindow.h”具体代码如下

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDockWidget>
#include <QTextEdit>

class MainWindow : public QMainWindow
{
	Q_OBJECT

public:
	MainWindow( QWidget *parent = nullptr );
	~MainWindow();

private:
	/* 停靠窗口部件 */
	QDockWidget *dockWidget;
	/* 文本编辑框 */
	QTextEdit *textEdit;
};
#endif  /* MAINWINDOW_H */

在源文件“mainwindow.cpp”具体代码如下。

#include "mainwindow.h"

MainWindow::MainWindow( QWidget *parent )
	: QMainWindow( parent )
{
	/* 设置主窗体的显示的位置与大小 */
	this->setGeometry( 0, 0, 800, 480 );

	/* 实例化标题为停靠窗口 */
	dockWidget = new QDockWidget( "停靠窗口", this );

	/* 实例化文本编辑框 */
	textEdit = new QTextEdit( dockWidget );

	textEdit->setText( "这是一个测试" );

	/* 停靠窗口添加文本编辑框 */
	dockWidget->setWidget( textEdit );

	/* 放在主窗体的顶部 */
	this->addDockWidget( Qt::TopDockWidgetArea, dockWidget );
}


MainWindow::~MainWindow()
{
}

3. 运行效果

程序编译运行的结果如下。拖动停靠窗口可以移动到另一个位置,松手则停靠。
在这里插入图片描述

转自:Qt控件----容器_冷月枫啊的博客-CSDN博客_qt容器控件 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐