首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C+Qt笔记009:基本布局

依法编程Autocodes

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

目录

C++Qt笔记009:基本布局(QLayout) 1

一、基本布局概述 2

二、常用的布局方法 2

三、基本布局项目案例 3

(一)项目功能 3

(二)设计分析 3

(三)程序注释 7

一、基本布局概述

Qt提供了QHBoxLayout类、QVBoxLayout类及QGridLayout类等的基本布局管理,分别是水平排列布局、垂直排列布局和网格排列布局。它们之间的继承关系如图。

二、常用的布局方法

布局中,常用的方法有addWidget()和addLayout()。

1、addWidget()方法用于加入需要布局的控件,方法原型如下:

voidaddWidget

(

QWidget*widget,//需要插入的控件对象

intfromRow,//插入的行

intfromColumn,//插入的列

introwSpan,//表示占用的行数

intcolumnSpan,//表示占用的列数

Qt::Alignmentalignment=//描述各个控件的对齐方式

)

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

voidaddLayout

(

QLayout*layout,//表示需要插入的子布局对象

introw,//插入的起始行

intcolumn,//插入的起始列

introwSpan,//表示占用的行数

intcolumnSpan,//表示占用的列数

Qt::Alignmentalignment=//指定对齐方式

)

三、基本布局项目案例

(一)项目功能

通过实现一个“用户基本资料修改”的功能表来介绍如何使用基本布局管理,如QHBoxLayout类、QVBoxLayout类及QGridLayout类,效果如图。

(二)设计分析

1、本实例共用到四个布局管理器,分别是LeftLayout、RightLayout、BottomLayout和MainLayout,其布局框架如图所示。

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

3、打开“dialog.h”头文件,在头文件中声明对话框中的各个控件,添加代码。

dialog.h文件

#ifndefDIALOG_H

#defineDIALOG_H

//源代码编码必须是:UTF-8(BOM)

#if_MSC_VER>=1600

#pragmaexecution_character_set("utf-8")

#endif

#include

#include

#include

#include

#include

#include

#include

classDialog:publicQDialog

{

Q_OBJECT

public:

Dialog(QWidget*parent=);

~Dialog();

private:

//左侧

QLabel*UserNameLabel;//用户名

QLabel*NameLabel;//姓名

QLabel*SexLabel;//性别

QLabel*DepartmentLabel;//部门

QLabel*AgeLabel;//年龄

QLabel*OtherLabel;//备注

QLineEdit*UserNameLineEdit;//用户名输入区

QLineEdit*NameLineEdit;//姓名输入区

QComboBox*SexComboBox;//性别选择区

QTextEdit*DepartmentTextEdit;//部门输入区

QLineEdit*AgeLineEdit;//年龄输入区

QGridLayout*LeftLayout;//表格布局管理器

//右侧

QLabel*HeadLabel;//头像标签

QLabel*HeadIconLabel;//头像显示

QPushButton*UpdateHeadBtn;//更新按钮

QHBoxLayout*TopRightLayout;//水平布局

QLabel*IntroductionLabel;//个人说明标签

QTextEdit*IntroductionTextEdit;//个人说明输入框

QVBoxLayout*RightLayout;//垂直布局

//底部

QPushButton*OKBtn;//确定按钮

QPushButton*CancelBtn;//取消按钮

QHBoxLayout*ButtomLayout;//水平布局

};

#endif//DIALOG_H

dialog.cpp

#include"dialog.h"

#include

Dialog::Dialog(QWidget*parent)

:QDialog(parent)

{

setWindowTitle("UserInfo");

/**************左侧**************/

UserNameLabel=newQLabel("用户名");

UserNameLineEdit=newQLineEdit;

NameLabel=newQLabel("姓名");

NameLineEdit=newQLineEdit;

SexLabel=newQLabel("性别");

SexComboBox=newQComboBox;

SexComboBox->addItem("女");

SexComboBox->addItem("男");

DepartmentLabel=newQLabel("部门");

DepartmentTextEdit=newQTextEdit;

AgeLabel=newQLabel("年龄");

AgeLineEdit=newQLineEdit;

OtherLabel=newQLabel("备注");

OtherLabel->setFrameStyle(QFrame::Panel|QFrame::Sunken);

LeftLayout=newQGridLayout;//表格布局管理器

//向布局中加入需要布局的控件

LeftLayout->addWidget(UserNameLabel,,);

LeftLayout->addWidget(UserNameLineEdit,,1);

LeftLayout->addWidget(NameLabel,1,);

LeftLayout->addWidget(NameLineEdit,1,1);

LeftLayout->addWidget(SexLabel,2,);

LeftLayout->addWidget(SexComboBox,2,1);

LeftLayout->addWidget(DepartmentLabel,3,);

LeftLayout->addWidget(DepartmentTextEdit,3,1);

LeftLayout->addWidget(AgeLabel,4,);

LeftLayout->addWidget(AgeLineEdit,4,1);

LeftLayout->addWidget(OtherLabel,5,,1,2);

LeftLayout->setColumnStretch(,1);

LeftLayout->setColumnStretch(1,3);

/**************右侧**************/

HeadLabel=newQLabel("头像:");

HeadIconLabel=newQLabel;

QPixmapicon("312.png");

HeadIconLabel->setPixmap(icon);

HeadIconLabel->resize(icon.width(),icon.height());

UpdateHeadBtn=newQPushButton("更新");

//完成右上侧头像选择区的布局

TopRightLayout=newQHBoxLayout();

TopRightLayout->setSpacing(20);//设定各个控件之间的间距是20

TopRightLayout->addWidget(HeadLabel);

TopRightLayout->addWidget(HeadIconLabel);

TopRightLayout->addWidget(UpdateHeadBtn);

IntroductionLabel=newQLabel("个人说明");

IntroductionTextEdit=newQTextEdit;

//完成右侧的布局

RightLayout=newQVBoxLayout();

RightLayout->setMargin(10);

RightLayout->addLayout(TopRightLayout);

RightLayout->addWidget(IntroductionLabel);

RightLayout->addWidget(IntroductionTextEdit);

/**************底部**************/

OKBtn=newQPushButton("确定");

CancelBtn=newQPushButton("取消");

//完成下方两个按钮的布局

ButtomLayout=newQHBoxLayout();

ButtomLayout->addStretch();

ButtomLayout->addWidget(OKBtn);

ButtomLayout->addWidget(CancelBtn);

QGridLayout*mainLayout=newQGridLayout(this);

mainLayout->setMargin(15);

mainLayout->setSpacing(10);

mainLayout->addLayout(LeftLayout,,);

mainLayout->addLayout(RightLayout,,1);

mainLayout->addLayout(ButtomLayout,1,,1,2);

mainLayout->setSizeConstraint(QLayout::SetFixedSize);

}

Dialog::~Dialog()

{

}

(三)程序注释

【1】第8行,设定窗口标题;

【2】第11-23行,实例化左侧控件;

【3】第24行,OtherLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken);

设置控件的风格。

setFrameStyle()是QFrame的方法,参数以或的方式设定控件的面板风格,由形状(QFrame::Shape)和阴影(QFrame::Shadow)两项配合设定。其中,形状有NoFrame, Panel,Box,HLine,VLine以及WinPanel 6种,阴影有Plain, Raised和Sunken 3种。

【4】第25行定义一个QGridLayout表格布局管理器对象LeftLayout,由于此布局管理器并不是主布局管理器,因此不用指定父窗口,最后由主布局管理器统一指定。在定义代码中,可以不必为各个控件指定父窗口,使用布局管理会自动指定布局管理下的所有控件的父窗口。

【5】第28-38行,向左侧布局中加入需要布局的控件。

QGridLayout类的addWidget()方法用来向布局中加入需布局的控件,addWidget()的函数原型如下:

addWidget (QWidget)

addWidget (QWidget, int, int, Qt.Alignment alignment = 0)

addWidget (QWidget, int, int, int, int, Qt.Alignment alignment = 0)

QWidget参数为需插入的控件对象,后面的两个int参数为插入的行和列,再后面两上int参数为跨度的行数和跨度的列数,alignment参数描述各控件的对齐方式。

【6】第39、40行,设定两列分别占用的空间的比例,此处设定两列的空间比为1:3。即使对话框框架大小改变了,两列之间的宽度比依然保持不变。

LeftLayout->setColumnStretch(0,1);

LeftLayout->setColumnStretch(1,3);

【7】第43-54行实现对话框右上侧的头像选择区的布局,此处采用一个QHBoxLayout类进行布局管理。QHBoxLayout默认采取自左向右的方式顺序排列插入的控件,也可通过调用setDirection()方法设定排列的顺序,例如:

hLayout.setDirection(QBoxLayout.RightToLeft)

第45行,需要提前将图片保存在build-UserInfo-Desktop_Qt_5_10_1_MSVC2017_64bit-Debug文件中。

【8】第51行调用QLayout的setSpacing()方法设定各个控件之间的间距为20。

【9】第59-63行代码实现对话框右侧的布局。由一个QVBoxLayout实现布局,QVBoxLayout默认自上而下顺序排列插入的控件或子布局,也可通过setDirection()方法改变排列的顺序。由于右侧上部的头像选择区已使用布局,因此第61行调用addLayout()方法在布局中插入子布局。

【10】第69-72行代码实现对话框下方两个按钮的布局,采用QHBoxLayout实现。

【11】第70行调用addStretch()方法在按钮之前插入一个占位符,使两个按钮能靠右对齐。并且在整个对话框的大小发生改变时,保证按钮的大小不发生变化。合理使用addStretch()能让界面的布局效果增色不少。

【12】第74行,QGridLayout *mainLayout=new QGridLayout(this);

最后实现主布局,用一个QGridLayout实现,并在定义主布局时指定父窗口this,也可调用this-> setLayout(mainLayout)。

【13】第75行设定对话框的边距为15。

【14】第77、78行插入的子布局占用了两列,使用的函数方法和前面的是一样的,也调用addLayout()方法,只是参数不同,原型如下:

addLayout (QLayout, int, int, int, int, Qt.Alignment alignment = 0)

QLayout参数为需插入的控件对象,后面的两个int参数为插入的行和列,再后面两上int参数为跨度的行数和跨度的列数,alignment参数描述各控件的对齐方式。

【15】最后,第81行设定对话框的控件总是最优化显示,并且用户无法改变对话框的大小,所谓最优化显示,即控件都按其sizeHint()的大小显示。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180829A0M7VT00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券