容器
容器(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
#include
#include
#include
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
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 list;
list addStretch( 1 );
/* vBoxLayout 布局设置为 groupBox 布局 */
groupBox->setLayout( vBoxLayout );
}
MainWindow::~MainWindow()
{
}
在源文件“main.cpp”具体代码由新建项目时生成,无改动。
3. 运行效果程序编译运行的结果如下,可以看到 radioButton 有规则的排布在 groupBox 组框里面。
QScrollArea 类提供到另一个小部件的滚动视图。
2. 用法示例例 34_qscrollarea 滚动视图(难度:简单),使用一个 Label 标签,将 Label 标签设置为一张图片,并把 Label 标签放置于滚动区域内,此时图片应要大于滚动区域才会出现滚动条。
在新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可。项目新建完成如下图。 在头文件“mainwindow.h”具体代码如下。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
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(工具盒类)提供了一种列状的层叠窗体,中文译为工具箱,类似抽屉。
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
#include
#include
#include
#include
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 strList;
strList addItem( groupBox[1], "黑名单" );
}
MainWindow::~MainWindow()
{
}
在源文件“main.cpp”具体代码由新建项目时生成,无改动。
3. 运行效果程序编译运行的结果如下,本次使用 QToolButool 作为 QGroupBox 的子项,也可以使用其他 QWidget 小部件,如 QWidget 等。(注意本程序在 linux 运行效果如下,若如在 Windows 下,可能 QToolBox 的显示样式不一样)。点击“我的好友”列表,则会出现好友列表,点击“黑名单”则会出现黑名单列表。
QTabWidget 继承 QWidget,QTabWidget 类提供了一组选项卡(多页面)小部件。QTabWidget 主要是用来分页显示的,每一页一个界面,众多界面公用一块区域,节省了界面大小,很方便的为用户显示更多的信息。类似浏览器的多标签页面,所以这个控件在实际项目中也会经常用到。
2. 用法示例例 36_ qtabwidget ,标题栏多页面切换(难度:简单),本例创建 3 个页面,每个页面里有一个 Label 标签部件,点击每个页面的选项卡则会切换到不同的页面上。
在新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可。项目新建完成,并添加了几张资源图片如下图。 在头文件“mainwindow.h”具体代码如下。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
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 strLabelList;
strLabelList addWidget( stackedWidget );
/* 将 widget 的布局设置成 hboxLayout */
widget->setLayout( hBoxLayout );
/* 利用 listWidget 的信号函数 currentRowChanged()与
* 槽函数 setCurrentIndex(),进行信号与槽连接
*/
connect( listWidget, SIGNAL( currentRowChanged( int ) ),
stackedWidget, SLOT( setCurrentIndex( int ) ) );
}
MainWindow::~MainWindow()
{
}
在源文件“main.cpp”具体代码由新建项目时生成,无改动。
3. 运行效果程序编译运行的结果如下,点击列表视图的不同的项会切换到不同的页面上。
在前面 三 已经举过例子
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
#include
#include
#include
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继承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
#include
#include
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容器控件