QT5开发及实例学习之七布局管理

本文详细介绍了Qt中的QSplitter、QDockWidget和QStackedWidget组件,以及基本布局管理。QSplitter允许用户自由调整子窗口大小,QDockWidget支持停靠窗口,QStackedWidget实现窗口切换。同时,文章还阐述了如何使用QLayout进行水平、垂直和网格布局,并展示了相关代码示例。
摘要由CSDN通过智能技术生成


前言


一、分割窗口QSplitter类

  创建一个简单的分割窗口,整个窗口由三个子窗口构成,各个子窗口之间的大小可随意拖拽改变;
代码如下(示例):

#include "mainwindow.h"			//头文件
#include <QApplication>
#include <QSplitter>
#include <QTextEdit>
#include <QTextCodec>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QFont font("ZYSong18030", 12);		//指定显示字体
    a.setFont(font);
    //主分割窗口
    QSplitter *splitterMain = new QSplitter(Qt::Horizontal);	//(a)
    QTextEdit *textLeft = new QTextEdit(QObject::tr("Left Widget"), splitterMain);	//(b)

    textLeft->setAlignment(Qt::AlignCenter);					//(c)
    //右分割窗口
    QSplitter *splitterRight = new QSplitter(Qt::Vertical, splitterMain);			//(d)
    splitterRight->setOpaqueResize(false);						//(e)
    QTextEdit *textUp = new QTextEdit(QObject::tr("Top Widget"), splitterRight);
    textUp->setAlignment(Qt::AlignCenter);
    QTextEdit *textBottom = new QTextEdit(QObject::tr("Bottom Widget"), splitterRight);
    textBottom->setAlignment(Qt::AlignCenter);

    splitterMain->setStretchFactor(1, 1);						//(f)
    splitterMain->setWindowTitle(QObject::tr("Splitter"));
    splitterMain->show();

//    MainWindow w;
//    w.show();

    return a.exec();
}

(a)新建一个QSplitter类对象,作为主分割窗口,设定此分割窗口为水平分割。
(b)新建一个QTextEdit类对象,并将其插入主分割窗口中。
(c)设定TextEdit中文字对齐方式,常用对齐方式有:

  • Qt::AlignLeft:左对齐
  • Qt::AlignRight:右对齐
  • Qt::AlignCenter:文字居中(Qt::AlignHCenter为水平居中,Qt::AlignVCenter为垂直居中)。
  • Qt::AlignUp:文字与顶部对齐
  • Qt::AlignBottom:文字与底部对齐

(d)新建一个QSplitter类对象,作为右分割窗口,设定此分割窗口为垂直分割窗口,并以主分割窗口为父窗口。
(e)调用setOpaqueResize(bool)方法用于设定分割窗口的分割条在拖拽时是否为实时更新显示,若设为true则实时更新显示,若设为false则在拖拽时只显示一条灰色的粗浅线,在拖拽到位并释放鼠标后再显示分割条。默认为true。
(f)调用setStretchFactor()方法用于设定可伸缩控件,第一个参数用于指定设置的控件序号,控件序号按插入的先后次序从0起依次编号;第二个参数为大于0的值,表示此控件为可伸缩控件。

二、停靠窗口QDockWidget类

设置停靠窗口的一般流程如下:
(1)创建一个QDockWidget对象的停靠窗体;
(2)设置此停靠窗体的属性,通常调用setFeatures()及setAllowedAreas()两种方法;
(3)新建一个要插入停靠窗体的控件,常用的有QListWidget和QTextEdit;
(4)将控件插入停靠窗体,调用QDockWidget的setWidget()方法;
(5)使用addDockWidget()方法在MainWindow中加入此停靠窗体。

代码如下(示例):

#include "dockwindows.h"
#include <QTextEdit>
#include <QDockWidget>

DockWindows::DockWindows(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle(tr("DockWindows"));      //设置主窗口的标题栏文字
    QTextEdit *te = new QTextEdit(this);    //定义一个QTextEdit对象作为主窗口
    te->setText(tr("Main Window"));
    te->setAlignment(Qt::AlignCenter);
    setCentralWidget(te);                   //将此编辑框设为主窗口的中央窗口
    //停靠窗口1
    QDockWidget *dock = new QDockWidget(QObject::tr("DockWindow1"), this);
    //可移动
    dock->setFeatures(QDockWidget::DockWidgetMovable);							//(a)
    dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);	//(b)

    QTextEdit *te1 = new QTextEdit();
    te1->setText(tr("Window1,The dock widget can be moved between docks by the user" ""));
    dock->setWidget(te1);
    addDockWidget(Qt::RightDockWidgetArea, dock);
    //停靠窗口2
    dock = new QDockWidget(tr("DockWindow2"), this);
    dock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable);//可关闭、可浮动
    QTextEdit *te2 = new QTextEdit();
    te2->setText(tr("Window2,The dock widget can be detached from the main window,""and floated as an independent window, and can be closed"));
    dock->setWidget(te2);
    addDockWidget(Qt::RightDockWidgetArea, dock);
    //停靠窗口3
    dock = new QDockWidget(tr("DockWindow3"), this);
    dock->setFeatures(QDockWidget::AllDockWidgetFeatures);  //全部特性
    QTextEdit *te3 = new QTextEdit();
    te3->setText(tr("Window3,The dock widget can be closed, moved, andfloated"));
    dock->setWidget(te3);
    addDockWidget(Qt::RightDockWidgetArea, dock);
}

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

void setFeatures(DockWidgetFeatures features)

参数QDockWidget::DockWidgetFeatures指定窗体的特性,参数包括:

  • QDockWidget::DockWidgetClosable:停靠窗体可关闭
  • QDockWidget::DockWidgetMovable:停靠窗体可移动
  • QDockWidget::DockWidgetFloatable:停靠窗口可浮动
  • QDockWidget::AllDockWidgetFeatures:此参数表示拥有停靠窗体的所有特性
  • QDockWidget::NoDockWidgetFeatures:不可移动、不可关闭、不可浮动

此参数可采用或(|)的方式对停靠窗体进行特性设定。
(b)setAllowedAreas()方法设置停靠窗体可停靠的区域,原型如下:

void setAllowedAreas(Qt::DockWidgetAreas areas)

参数Qt::DockWidgetAreas指定停靠窗体可停靠的区域,参数包括:

  • Qt::LeftDockWidgetArea:可在主窗口的左侧停靠
  • Qt::RightDockWidgetArea:可在主窗口的右侧停靠
  • Qt::TopDockWidgetArea:可在主窗口的顶部停靠
  • Qt::BottomDockWidgetArea:可在主窗口的底部停靠
  • Qt::AllDockWidgetArea:可在主窗口任意(以上四个)部位停靠
  • Qt::NoDockWidgetArea:只可停靠在插入处

也可采用或(|)的方式进行。

三、堆栈窗体QStackedWidget类

实际应用中,堆栈窗体多与列表框QListWidget及下拉列表框QComboBox配合使用。
代码如下(示例):

stackdlg.h中添加:
#include <QListWidget>
#include <QStackedWidget>
#include <QLabel>

private:
    QListWidget *list;
    QStackedWidget *stack;
    QLabel *label1;
    QLabel *label2;
    QLabel *label3;
    
stackdlg.cpp中添加:
#include "stackdlg.h"
#include <QHBoxLayout>

StackDlg::StackDlg(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle(QObject::tr("StackedWidget"));
    list = new QListWidget(this);       //新建一个QListWidget控件对象
    //在新建的QListWidget控件中插入三个条目,作为选择项
    list->insertItem(0, QObject::tr("Window1"));
    list->insertItem(1, QObject::tr("Window2"));
    list->insertItem(2, QObject::tr("Window3"));
    //创建三个QLabel标签控件对象,作为堆栈窗口需要显示的三层窗体
    label1 = new QLabel(QObject::tr("WindowTest1"));
    label2 = new QLabel(QObject::tr("WindowTest2"));
    label3 = new QLabel(QObject::tr("WindowTest3"));
    stack = new QStackedWidget(this);   //新建一个QStackedWidget堆栈窗体对象

    //将创建的三个QLabel标签控件依次插入堆栈窗体中
    stack->addWidget(label1);
    stack->addWidget(label2);
    stack->addWidget(label3);
    QHBoxLayout *mainLayout = new QHBoxLayout(this);    //对整个对话框进行布局
    mainLayout->setMargin(5);                           //设定对话框(或窗体)的边距为5
    mainLayout->setSpacing(5);                          //设定各个控件之间的间距为5
    mainLayout->addWidget(list);
    mainLayout->addWidget(stack, 0, Qt::AlignHCenter);
    mainLayout->setStretchFactor(list, 1);				//(a)
    mainLayout->setStretchFactor(stack, 3);
    connect(list, SIGNAL(currentRowChanged(int)), stack, SLOT(setCurrentIndex(int)));//(b)
}

(a)设定可伸缩控件,第一个参数用于指定设置的控件(序号从0起编号);第二个参数的值大于0则表示此控件为可伸缩控件。
(b)将QListWidget的currentRow()信号与堆栈窗体的setCurrentIndex()槽函数连接起来,实现按选择显示窗体。此处的堆栈窗体index按插入的顺序从0起依次排序,与QListWidget的条目排序相一致。

四、基本布局(QLayout)

Qt提供了QHBoxLayout类、QVBoxLayout类及QGridLayout类等的基本布局管理,分别是水平排列布局、垂直排列布局及网格排列布局。
各种布局的继承关系:

QLayout QBoxLayout QHBoxLayout QVBoxLayout QGridLayout

布局中常用的方法有addWidget()和addLayout()。
addWidget()方法用于加入需要布局的控件,方法原型如下:

void addWidget
(
	QWidget *widget,			//需要插入的控件对象
	int formRow,				//插入的行
	int fromColumn,				//插入的列
	int rowSpan,				//表示占用的行数
	int columnSpan,				//表示占用的列数
	Qt::Alignment alignment=0	//描述各个控件的对齐方式
)

addLayout()方法用于加入子布局,方法原型如下:

void addLayout
(
	QLayout *layout,			//表示需要插入的子布局对象
	int row,					//插入的起始行
	int column,					//插入的起始列
	int rowSpan,				//表示占用的行数
	int columnSpan,				//表示占用的列数
	Qt::Alignment alignment=0	//指定对齐方式
)

QHBoxLayout默认采取的是以自左向右的方式顺序排列插入控件或子布局,也可以通过调用setDirection()方法设定排列顺序(如layout->setDirection(QBoxLayout::RightToLeft));
QVBoxLayout默认采用的是以自上而下的方式顺序排列插入控件或子布局,也可以通过调用setDirection()方法设定排列顺序。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值