QT 的QLayout布局属性


QT布局控件


在QT的布局类中主要有如下的关系:
在这里插入图片描述
QLayout 类主要作为布局类的基类,是抽象类,提供多种接口函数给继承类。
QLayout 提供了子页面,子Layout的添加的接口,同时提供了边界设置,菜单项设置等一系列接口

virtual void  addItem(QLayoutItem *item) = 0 
void  addWidget(QWidget*w)
void  setContentsMargins(intleft, int top, int right, int bottom)
void  setMenuBar(QWidget*widget)

QBoxLayout 主要分为水平布局类(QHBoxLayout)和垂直布局类(QVBoxLayout)
QBoxLayout作为QLayout的子类,提供了一些额外的信息:提供元素的拉伸比例,添加空元素等

void  addLayout(QLayout*layout, int stretch = 0)
void  addSpacerItem(QSpacerItem*spacerItem)
void  addSpacing(intsize)
bool setStretchFactor(QWidget*widget, int stretch)
bool setStretchFactor(QLayout*layout, int stretch)

QFormLayout 主要用于双列多行的布局
QFormLayout 作为Qlayout 的子类,提供了多种部件的添加,插入,获取部件位置的功能函数。

void addRow(const QString &labelText, QWidget *field)
void getItemPosition(int index, int *rowPtr, ItemRole *rolePtr) const
void getLayoutPosition(QLayout *layout, int *rowPtr, ItemRole *rolePtr) const
void insertRow(int row, QWidget *label, QWidget *field)
QLayoutItem *itemAt(int row, ItemRole role) const
Qt::Alignment labelAlignment() const
QWidget *labelForField(QWidget *field) const
void removeRow(int row)
int rowCount() const

QGridLayout 主要用于多列多行的布局
QGridLayout同样作为QLayout的子类,在父类的基础上,提供了多种子部件添加,获取位置,数量,设置最大最小高度宽度的功能函数。

void addItem(QLayoutItem *item, int row, int column, int rowSpan = 1, int columnSpan = 1, Qt::Alignment alignment = Qt::Alignment())
void addLayout(QLayout *layout, int row, int column, Qt::Alignment alignment = Qt::Alignment())
void addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment())
int columnCount() const
int columnMinimumWidth(int column) const
int columnStretch(int column) const
void getItemPosition(int index, int *row, int *column, int *rowSpan, int *columnSpan) const
int rowCount() const
int rowMinimumHeight(int row) const
void setColumnMinimumWidth(int column, int minSize)
void setColumnStretch(int column, int stretch)
void setHorizontalSpacing(int spacing)
void setOriginCorner(Qt::Corner corner)
void setRowMinimumHeight(int row, int minSize)
void setRowStretch(int row, int stretch)

QStackedLayout 主要提供了一种页面切换的布局
QStackedLayout在继承父类的部分接头的同时,实现添加,插入部件,获取当前序号和设置部件的重叠显示的属性。

int addWidget(QWidget *widget)
int currentIndex() const
QWidget *currentWidget() const
int insertWidget(int index, QWidget *widget)
void setStackingMode(StackingMode stackingMode)//设置部件的重叠时的效果,是仅显示当前最上层部件还是都显示
StackingMode stackingMode() const

QFormLayout的使用示例:

#include "formlayouttest.h"
#include <QFormLayout>
#include <QLineEdit>
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
FormlayoutTest::FormlayoutTest(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	QFormLayout *pLay = new QFormLayout(this);
	QLineEdit *pName = new QLineEdit();
	pLay->addRow("&Name", pName);


	QLineEdit *pEmail = new QLineEdit();
	pLay->addRow("&Email", pEmail);

	QLineEdit *pAge = new QLineEdit();
	pLay->insertRow(1, "&Age", pAge);

	QLabel *pInfo = new QLabel();
	pInfo->setText("Output Information");
	pInfo->setStyleSheet("color:Green;");
	pLay->insertRow(0, "", pInfo);
	
	//添加Save和Clear按钮
	QPushButton *pSave = new QPushButton("Save");
	QPushButton *pClear = new QPushButton("Clear");
	QObject::connect(pSave, SIGNAL(clicked()), this, SLOT(Save()));
	QObject::connect(pClear, SIGNAL(clicked()), this, SLOT(Clear()));
	//添加一个平行布局
	QHBoxLayout  *pHLay = new QHBoxLayout();
	pHLay->addWidget(pSave);
	pHLay->addWidget(pClear);
	pLay->addRow(pHLay);
}
void FormlayoutTest::Save()
{
	//找到Layout
	QFormLayout *formlay = (QFormLayout*)this->layout();
	//显示错误信息label
	QLabel *label = (QLabel*)formlay->itemAt(0, QFormLayout::FieldRole)->widget();
	//存放错误信息
	QString error = "";

	//遍历所有QLineEdit
	for (int i = 0; i < formlay->rowCount(); i++) {
		QLayoutItem *item = formlay->itemAt(i, QFormLayout::FieldRole);
		QLineEdit *e = (QLineEdit*)item->widget();
		if (!e)
			continue;

		//获取标题内容
		QLayoutItem *layItem = formlay->itemAt(i, QFormLayout::LabelRole);
		if(!layItem) continue;
		QLabel *titelLabel = (QLabel *)layItem->widget();
		if(!titelLabel) continue;
		QString title = titelLabel->text();

		QString strname = e->metaObject()->className();
		if (strname == "QLineEdit") {
			if (e->text().trimmed() == "")
			{
				e->setFocus();
				error += title;
				error += "  is empty!\n";
			}
		}
	}
	label->setText(error);
}
void FormlayoutTest::Clear()
{
	//在一个weidget 中只能有一个大QformLayout
	QFormLayout *formlay = (QFormLayout*)this->layout();
	for (int i = 0; i < formlay->rowCount(); i++) {
		QLayoutItem *item = formlay->itemAt(i, QFormLayout::FieldRole);
		QLineEdit *e = (QLineEdit*)item->widget();
		if(!e)
			continue;
		QString strname = e->metaObject()->className();
		if (strname == "QLineEdit") {
			e->setText("");
		}
	}
}

在这里插入图片描述

QGridLayout的使用示例:

#include "uilayout.h"
#include <QtWidgets/QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QDebug>
#include <QGridLayout>
int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	QWidget *pWidget = new QWidget;
	QGridLayout *pGL = new QGridLayout(pWidget);
	QPushButton *pbtn11 = new QPushButton("btn11");
	pGL->addWidget(pbtn11, 0, 0);
	QPushButton *pbtn12 = new QPushButton("btn12");
	pGL->addWidget(pbtn12, 0, 1);
	QPushButton *pbtn13 = new QPushButton("btn13");
	pGL->addWidget(pbtn13, 0, 2);

	QPushButton *pbtn21 = new QPushButton("btn21");
	pGL->addWidget(pbtn21,1, 0);
	QPushButton *pbtn23 = new QPushButton("btn23");
	pGL->addWidget(pbtn23, 1, 2);

	//水平间距
	pGL->setHorizontalSpacing(10);
	//垂直间距
	pGL->setVerticalSpacing(20);
	pWidget->show();
	return a.exec();
}

在这里插入图片描述

具体的其他功能函数,可以参见QT助手文档。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值