C+Qt笔记008:Qt5布局管理之分割窗口、停靠窗口、堆栈窗口类的使用

依法编程Autocodes

欢迎各位小伙伴关注”依法编程“,一起交流

目录

一、分割窗口QSplitter类 2

(一)例程功能 2

(二)项目设计 2

(三)程序解释 3

二、停靠窗口QDockWidget类 4

(一)例程功能 5

(二)项目设计 5

(三)程序解释 7

三、停靠窗口QDockWidget类 8

(一)例程功能 8

(二)项目设计 9

(三)程序解释 11

该文持续修正中,有错误请指出,不胜感激!

转载请注明出处!

微信公众号:依法编程

原作者保留使用权利,未经许可严禁用于个人商业用途!

一、分割窗口QSplitter类

(一)例程功能

一个简单的分割窗口功能,整个对话框由三个窗口组成,各个窗口之间的大小可随意拖曳改变,效果如图所示。

(二)项目设计

新建Qt Widgets Application,项目名称为“Splitter”,基类选择“QMainWindow”,取消“创建界面”复选框的选中状态。

main.cpp程序:

#include"mainwindow.h"

#include

#include

#include

#include

intmain(intargc,char*argv[])

{

QApplicationa(argc,argv);

//指定显示字体

QFontfont("ZYSong18030",12);

a.setFont(font);

//主分割窗口

QSplitter*splittermain=newQSplitter(Qt::Horizontal,);

QTextEdit*textLeft=newQTextEdit("LeftWidget",splittermain);

textLeft->setAlignment(Qt::AlignCenter);

//右部分分割窗口

QSplitter*splitterRight=newQSplitter(Qt::Vertical,splittermain);

splitterRight->setOpaqueResize(true);

QTextEdit*textUp=newQTextEdit("BottomWidget",splitterRight);

textUp->setAlignment(Qt::AlignCenter);

QTextEdit*textBottom=newQTextEdit("BottomWidget",splitterRight);

textBottom->setAlignment(Qt::AlignCenter);

splittermain->setStretchFactor(1,1);

splittermain->setWindowTitle("Splitter");

splittermain->show();

returna.exec();

}

(三)程序解释

1、QSplitter *splitterMain = new QSplitter(Qt::Horizontal, 0);

新建一个QSplitter类对象,作为主分割窗口,并且设定此窗口为水平分割窗口。

2、QTextEdit*textLeft = new QTextEdit("Left Widget",splitterMain);

新建一个QTextEdit类对象,并将其插入主分割窗口。

3、textLeft->setAlignment(Qt::AlignCenter);

设置TextEdit对象中文本的对齐方式。常用的对齐方式:

Qt::AlignLeft 左对齐

Qt::AlignRight 右对齐

Qt::AlignCenter 文字居中

Qt::AlignHCenter 水平居中

Qt::AlignVCenter 垂直居中

Qt::AlignUp 文字与顶端对齐

Qt::AlignBottom 文字与底端对齐

4、QSplitter *splitterRight = new QSplitter(Qt::Vertical, splitterMain);

新建一个QSplitter类对象,作为右分割窗口,并以主分割窗口作为父窗口。设定分割窗口为垂直分割窗口。

5、splitterRight->setOpaqueResize(true);

设定在拖拽分割条时,是否实时更新。若为true,则实时更新;否则在拖拽时显示一条虚线。

6、splitterMain->setStretchFactor(1,1);

此函数用于设定:控件是否可伸缩。第一个参数用于指定控件的序号,控件序号按插入的先后次序从0起依次编号,第二个函数大于0时,表示控件可伸缩,小于0时,表示控件不可伸缩。

二、停靠窗口QDockWidget类

停靠窗口QDockWidget类也是应用程序中经常用到的,设置停靠窗口的一般流程如下。

(1)创建一个QDockWidget对象的停靠窗体。

(2)设置此停靠窗体的属性,通常调用setFeatures()及setAllowedAreas()两种方法。

(3)新建一个要插入停靠窗体的控件,常用的有QListWidget和QTextEdit。

(4)将控件插入停靠窗体,调用QDockWidget的setWidget()方法。

(5)使用addDockWidget()方法在MainWindow中加入此停靠窗体。

(一)例程功能

停靠窗口QDockWidget类的使用:窗口1只可在主窗口的左边和右边停靠;窗口2只可在浮动和右部停靠两种状态间切换,并且不可移动;窗口3可实现停靠窗口的各种状态。

(二)项目设计

新建Qt Widgets Application,项目名称为“DockWindows”,基类选择“QMainWindow”,类名命名为“DockWindows”,取消“创建界面”复选框的选中状态。

mainwindow.cpp文件

#include"mainwindow.h"

#include

#include

MainWindow::MainWindow(QWidget*parent)

:QMainWindow(parent)

{

//设置主窗口的标题栏文字

setWindowTitle("DockWindows");

//定义一个QTextEdit对象作为主窗口

QTextEdit*te=newQTextEdit(this);

te->setText("MainWindow");

//设置TextEdit对象中文本的对齐方式

te->setAlignment(Qt::AlignCenter);

//将此编辑框设为主窗口的中央窗体

setCentralWidget(te);

//停靠窗口1

QDockWidget*dock=newQDockWidget("DockWindow1",this);

//设置停靠窗体的特性,可移动

dock->setFeatures(QDockWidget::DockWidgetMovable);

//设置停靠窗体可停靠的区域,只可以在左右两边停靠,上下悬浮均不可

dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);

//新建一个要插入停靠窗体的控件

QTextEdit*te1=newQTextEdit();

te1->setText("Window1,Thedockwidgetcanbemovedbetweendocksbytheuser");

//将控件插入停靠窗体

dock->setWidget(te1);

//在MainWindow中加入此停靠窗体

addDockWidget(Qt::RightDockWidgetArea,dock);

//停靠窗口2

dock=newQDockWidget("DockWindow2",this);

//可关闭,可浮动

dock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);

//设置停靠窗体可停靠的区域,只可以在右边停靠

dock->setAllowedAreas(Qt::RightDockWidgetArea);

QTextEdit*te2=newQTextEdit();

te2->setText("Window2,Thedockwidgetcanbedetachedfromthemainwindow,""andfloatedasanindependentwindow,andcanbeclosed");

dock->setWidget(te2);

addDockWidget(Qt::RightDockWidgetArea,dock);

//停靠窗口3

dock=newQDockWidget("DockWindow3",this);

//全部特征

dock->setFeatures(QDockWidget::AllDockWidgetFeatures);

QTextEdit*te3=newQTextEdit();

te3->setText("Window3,Thedockwidgetcanbeclosed,moved,andfloated");

dock->setWidget(te3);

addDockWidget(Qt::RightDockWidgetArea,dock);

}

MainWindow::~MainWindow()

{

}

(三)程序解释

此处需要重点介绍的是设置停靠窗体状态的方法:

setAllowedAreas()和 setFeatures()。

1、其中,setAllowedAreas()方法设置停靠窗体可停靠的区域,原型如下:

voidsetAllowedAreas(Qt::DockWidgetAreasareas)

其中参数Qt::DockWidgetAreas指定了停靠窗体可停靠的区域,包括以下几种:

Qt::LeftDockWidgetArea//左侧停靠

Qt::RightDockWidgetArea//右侧停靠

Qt::TopDockWidgetArea//顶端停靠

Qt::BottomDockWidgetArea//底部停靠

Qt::AllDockWidgetAreas//任意(以上四个)部位停靠

Qt::NoDockWidgetArea//只可停靠在插入处

2、setFeatures()方法设置停靠窗体的特性,原型如下:

voidsetFeatures(DockWidgetFeaturesfeatures)

参数QDockWidget::DockWidgetFeatures指定停靠窗体的特性,包括以下几种:

QDockWidget::DockWidgetClosable//停靠窗可关闭

QDockWidget::DockWidgetMovable//停靠窗可移动

QDockWidget::DockWidgetFloatable//停靠窗可浮动

QDockWidget::AllDockWidgetFeatures//拥有停靠窗的所有特性

QDockWidget::NoDockWidgetFeatures//停靠窗不可移动、不可关闭、不可浮动

三、停靠窗口QDockWidget类

QStackedWidget继承自QFrame。

QStackedWidget类提供了多页面切换的布局,一次只能看到一个界面。

QStackedWidget可用于创建类似于QTabWidget提供的用户界面。

(一)例程功能

堆栈窗体QStackedWidget类的使用,当选择左侧列表框中不同的选项时,右侧显示所选的不同的窗体。在此使用列表框QListWidget,效果如图。

(二)项目设计

新建Qt Widgets Application,项目名称为“StackedWidget”,基类选择“QDialog”,类名命名为“StackDlg”,取消“创建界面”复选框的选中状态。

1、stackdlg.h文件

#ifndefSTACKDLG_H

#defineSTACKDLG_H

#include

#include

#include

#include

classStackDlg:publicQDialog

{

Q_OBJECT

public:

StackDlg(QWidget*parent=);

~StackDlg();

private:

QListWidget*list;

QStackedWidget*stack;

QLabel*label1;

QLabel*label2;

QLabel*label3;

};

#endif//STACKDLG_H

2、stackdlg.cpp文件

#include"stackdlg.h"

#include

StackDlg::StackDlg(QWidget*parent)

:QDialog(parent)

{

setWindowTitle("StackWidget");

//新建一个QListWidget列表框控件对象

list=newQListWidget(this);

//在新建的QListWidget控件中插入三个条目,作为选择项

list->insertItem(,"Window1");

list->insertItem(1,"Window2");

list->insertItem(2,"Window3");

//创建三个QLabel标签控件对象,作为堆栈窗口需要显示的三层窗体

label1=newQLabel("WindowTest1");

label2=newQLabel("WindowTest2");

label3=newQLabel("WindowTest3");

//新建一个QStackedWidget堆栈窗体对象

stack=newQStackedWidget(this);

//将创建的三个Label标签控件依次插入堆栈窗体中

stack->addWidget(label1);

stack->addWidget(label2);

stack->addWidget(label3);

//对整个对话框进行布局

QHBoxLayout*mainLayout=newQHBoxLayout(this);

mainLayout->setMargin(5);//设定对话框(或窗体)的边距为5

mainLayout->setSpacing(5);//设定各个控件之间的间距为5

mainLayout->addWidget(list);

mainLayout->addWidget(stack,,Qt::AlignHCenter);

mainLayout->setStretchFactor(list,1);

mainLayout->setStretchFactor(stack,3);

connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));

}

StackDlg::~StackDlg()

{

}

(三)程序解释

1、设置主窗体布局时,用到了布局管理器。这里用到的是水平排列窗体QHBoxLayout:

QHBoxLayout *mainLayout=new QHBoxLayout(this);

2、设定可伸缩控件

mainLayout->setStretchFactor(list,1);

mainLayout->setStretchFactor(stack,3);

设定可伸缩控件,第一个参数用于指定设置的控件(序号从0起编号),第2个参数的值大于0则表示此控件为可伸缩控件。这里对list和stack的参数为1和3,区别就在于拉伸时的变化率的大小。

3、连接信号与槽

connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));

这个连接函数将QListWidget的信号currentRowChange(int)和QStackedWidget的槽setCurrentIndex(int)连接在一起,所以才导致了堆栈窗口的切换。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180812A0UEW100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券