在上篇文章中描述了實中套虛(用setLayout),虛中套實(用addWidget)。
本文再加1條,虛中套虛(用addLayout)。
所謂虛中套虛,是layout 套 layout 。
另外用循環代碼生成從左到右的相同結構界面。這是和拖拉GUI組件相比的優點之一。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖1-效果
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖2-1 布局關系圖1
? 說明:按照實中套虛,虛中套實原則
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2-1布局關系示意圖2
? ? ? ? ? ? ? ? ? ? ? ? ? ?說明:因為可以虛中套虛,省掉了圖2-1中紫色部分
1.頭文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLabel>
#include <QString>
#include <QLineEdit>
//#include <QHBoxLayout>
#include <QGridLayout>
#include <QFrame>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
//定義了兩個結構體,實現界面和數據分離
struct UserData//數據
{
? ? QString str;
};
struct UserPlot//界面顯示組件,結構化后方便調整界面
{
? ? QWidget w;//外觀上包含下面三個,實際上經過布局中繼
? ? QLabel lb;
? ? QLineEdit le;
? ? QFrame *l;//分割線
};
class Widget : public QWidget
{
? ? Q_OBJECT
public:
? ? Widget(QWidget *parent = nullptr);
? ? ~Widget();
private:
? ? Ui::Widget *ui;
? ? UserPlot up[3];//3個左到右排列
? ? UserData data[3];//3個,0對應上面的0,1對應上面的1,2對應上面的2
};
#endif // WIDGET_H
?
2.cpp文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
? ? : QWidget(parent)
? ? , ui(new Ui::Widget)
{
? ? ui->setupUi(this);
? ? QHBoxLayout *mainLayout = new QHBoxLayout;
? ? QGridLayout *subLayout0 = new QGridLayout;
? ? QGridLayout *subLayout1 = new QGridLayout;
? ? QGridLayout *subLayout2 = new QGridLayout;
? ? QGridLayout *subLayoutArray[3]= {subLayout0,subLayout1,subLayout2};
? ? QFrame *fp;
? ? data[0].str=QString("BeiJin");
? ? data[1].str=QString("ChongQin");
? ? data[2].str=QString("GuangZhou");
? ? for(int i=0;i<3;i++)//mainLayout布局里套了3個QWidget或layout
? ? {
? ? ? ? up[i].lb.setText(data[i].str);
? ? ? ? if (i<2)
? ? ? ? { ? up[i].l=new QFrame(this);
? ? ? ? ? ? fp=up[i].l;//豎線
? ? ? ? ? ? fp->setFrameShape(QFrame::VLine);//豎線
? ? ? ? ? ? fp->setFrameShadow(QFrame::Sunken);//豎線
? ? ? ? }
? ? ? ? subLayoutArray[i]->addWidget(&up[i].lb,0,0,1,1,Qt::AlignTop);//每個QGridLayout里
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//套了QLabel
? ? ? ? subLayoutArray[i]->addWidget(&up[i].le,1,0,1,1,Qt::AlignTop);//每個QGridLayout里
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//套了QLineEdit
? ? ? ? if (i<2)
? ? ? ? subLayoutArray[i]->addWidget(fp,0,1,2,1);//每個QGridLayout里套了QFrame,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //實際上是分割豎線
? ? ? ? //up[i].w.setLayout(subLayoutArray[i]);//每個QWidget里套了個QGridLayout
? ? ? ? //mainLayout->addWidget(&up[i].w);//上面一行與本行的效果,等效于下一行
? ? ? ? mainLayout->addLayout(subLayoutArray[i]);//layout 里 套 layout
? ? ? ? this->resize(400,100);
? ? }
? ? setLayout(mainLayout);//widget里套了個mainLayout布局
}
Widget::~Widget()
{
? ? delete ui;
}
?