Qt学习笔记(7):布局管理器3:多个管理器的结合使用

Qt布局管理器3

前面我们已经学习了各种窗口的实现,接下来,让我们把所有的类结合起来写一个大一点点的界面:
首先,新建Qt Widget Application ,项目名为Example,基类选择“QDialog",类命名为Content,取消”创建窗口“复选框。
在content.h文件写入:

#ifndef CONTENT_H
#define CONTENT_H

#include <QDialog>
#include <QStackedWidget>
#include <QPushButton>
#include "baseinfo.h"
#include "contact.h"
#include "detail.h"

class Content : public QFrame
{
    Q_OBJECT

public:
    Content(QWidget *parent = 0);
    ~Content();
    QStackedWidget *stack;//堆栈布局器
    QPushButton *AmendBtn;//按钮
    QPushButton *CloseBtn;
    BaseInfo *baseInfo;//子函数对象
    Contact *contact;//子函数对象
    Detail *detail;//子函数对象
};

#endif // CONTENT_H

在Content.cpp写入:

#include "content.h"
#include <QHBoxLayout>

Content::Content(QWidget *parent)
    : QFrame(parent)
{
    stack = new QStackedWidget(this);//堆栈布局管理器

stack->setFrameStyle(QFrame::Panel | QFrame::Raised);//设置框框的格式及阴影

baseInfo = new BaseInfo();//给三个对象分配空间
contact = new Contact();
detail = new Detail();
stack->addWidget(baseInfo);//把三个控件放到堆栈布局管理器
stack->addWidget(contact);
stack->addWidget(detail);

AmendBtn = new QPushButton(tr("Modify"));//设置两个按钮并分别取名
CloseBtn = new QPushButton(tr("Close"));
QHBoxLayout *BtnLayout = new QHBoxLayout;//水平布局管理器
BtnLayout->addStretch(1);//控制下面加入的两个按钮控件之间的间距及大小
//如果没有上面哪行代码的话,两个按钮运行后会占满一行。
BtnLayout->addWidget(AmendBtn);
BtnLayout->addWidget(CloseBtn);

QVBoxLayout *RightLayout = new QVBoxLayout(this);//垂直布局管理器
RightLayout->setMargin(10);//设置外围边框

RightLayout->setSpacing(6);//设置间隔
RightLayout->addWidget(stack);//将堆栈布局管理器
RightLayout->addLayout(BtnLayout);//将按钮部件加入右布局管理器
}

Content::~Content()
{

}

右Example项目名单上单击鼠标右键,选择添加新文件,之后选择C++ class,单击Choose。
在新弹出的对话框的Base class选择QWidget,在Class name后边输入BaseInfo.单击下一步,完成即可。
接下来,在baseinfo.h文件写入:

#ifndef BASEINFO_H
#define BASEINFO_H

#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QTextEdit>
#include <QGridLayout>
#include <QPushButton>

class BaseInfo : public QWidget
{
    Q_OBJECT
public:
    explicit BaseInfo(QWidget *parent = 0);

signals:

public slots:

private:
    //In the Left
    QLabel *UserNameLabel;
    QLabel *NameLabel;
    QLabel *SexLabel;
    QLabel *DepartmentLabel;
    QLabel *AgeLabel;
    QLabel *OtherLabel;
    QLineEdit *UserNameLineEdit;
    QLineEdit *NameLineEdit;
    QComboBox *SexComboBox;
    QTextEdit *DepartmentTextEdit;
    QLineEdit *AgeLineEdit;
    QGridLayout *LeftLayout;

    //In the right
    QLabel *HeadLabel;
    QLabel *HeadIconLabel;
    QPushButton *UpdateHeadBtn;
    QHBoxLayout *TopRightLayout;
    QLabel *IntroductionLabel;
    QTextEdit *IntroductionTextEdit;
    QVBoxLayout *RightLayout;
};

#endif // BASEINFO_H

在baseinfo.cpp写入:

#include "baseinfo.h"

BaseInfo::BaseInfo(QWidget *parent) : QWidget(parent)
{
    //In the Left
    UserNameLabel = new QLabel(tr("UserName: "));
    UserNameLineEdit = new QLineEdit;
    NameLabel = new QLabel(tr("Name: "));
    NameLineEdit = new QLineEdit;
    SexLabel = new QLabel(tr("Sex: "));
    SexComboBox = new QComboBox;
    SexComboBox->addItem(tr("Male"));
    SexComboBox->addItem(tr("Female"));
    DepartmentLabel = new QLabel(tr("Department: "));
    DepartmentTextEdit = new QTextEdit;
    AgeLabel = new QLabel(tr("Age: "));
    AgeLineEdit = new QLineEdit;
    OtherLabel = new QLabel(tr("Other: "));
    OtherLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken);
    LeftLayout = new QGridLayout();
    LeftLayout->addWidget(UserNameLabel,0,0);
    LeftLayout->addWidget(UserNameLineEdit,0,1);
    LeftLayout->addWidget(NameLabel,1,0);
    LeftLayout->addWidget(NameLineEdit,1,1);
    LeftLayout->addWidget(SexLabel,2,0);
    LeftLayout->addWidget(SexComboBox,2,1);
    LeftLayout->addWidget(DepartmentLabel,3,0);
    LeftLayout->addWidget(DepartmentTextEdit,3,1);
    LeftLayout->addWidget(AgeLabel,4,0);
    LeftLayout->addWidget(AgeLineEdit,4,1);
    LeftLayout->addWidget(OtherLabel,5,0,1,2);
    LeftLayout->setColumnStretch(0,1);
    LeftLayout->setColumnStretch(1,3);
    //In the Right
    HeadLabel = new QLabel(tr("Image: "));
    HeadIconLabel = new QLabel;
    QPixmap icon("1.png");//这里是个假的来着......就是取个名
    HeadIconLabel->setPixmap(icon);
    HeadIconLabel->resize(icon.width(),icon.height());
    UpdateHeadBtn = new QPushButton(tr("Update"));
    TopRightLayout = new QHBoxLayout();
    TopRightLayout->setSpacing(20);
    TopRightLayout->addWidget(HeadLabel);
    TopRightLayout->addWidget(HeadIconLabel);
    TopRightLayout->addWidget(UpdateHeadBtn);
    IntroductionLabel = new QLabel(tr("personal introduction: "));
    IntroductionTextEdit = new QTextEdit;
    RightLayout = new QVBoxLayout();
    RightLayout->setMargin(10);
    RightLayout->addLayout(TopRightLayout);
    RightLayout->addWidget(IntroductionLabel);
    RightLayout->addWidget(IntroductionTextEdit);

    QGridLayout *mainLayout = new QGridLayout(this);
    mainLayout->setMargin(15);
    mainLayout->setSpacing(10);
    mainLayout->addLayout(LeftLayout,0,0);
    mainLayout->addLayout(RightLayout,0,1);
    mainLayout->setSizeConstraint(QLayout::SetFixedSize);//固定窗口大小,使用后,整体窗体大小改变,不改变内部部件的大小。

}

继续添加新文件选择"C++ class’",单击”Choose",在Base class选择“QWidget”,在“Class Name"后面的文本框中输入类的名称Contact。
在contact.h文件中写入:

#ifndef CONTACT_H
#define CONTACT_H

#include <QWidget>
#include <QLabel>
#include <QGridLayout>
#include <QLineEdit>
#include <QCheckBox>

class Contact : public QWidget
{
    Q_OBJECT
public:
    explicit Contact(QWidget *parent = 0);

signals:

public slots:

private:
    QLabel *EmailLabel;
    QLineEdit *EmailLineEdit;
    QLabel *AddrLabel;
    QLineEdit *AddrLineEdit;
    QLabel *CodeLabel;
    QLineEdit *CodeLineEdit;
    QLabel *MoviTelLabel;
    QLineEdit *MoviTelineEdit;
    QCheckBox *MoviTelCheckBook;//可勾选的框框
    QLabel *ProTelLabel;
    QLineEdit *ProTelLineEdit;
    QGridLayout *mainLayout;
};

#endif // CONTACT_H

在contact.cpp文件写入:

#include "contact.h"

Contact::Contact(QWidget *parent) : QWidget(parent)
{
    EmailLabel = new QLabel(tr("Email: "));
    EmailLineEdit = new QLineEdit;
    AddrLabel = new QLabel(tr("Addr: "));
    AddrLineEdit = new QLineEdit;
    CodeLabel = new QLabel(tr("Code: "));
    CodeLineEdit = new QLineEdit;
    MoviTelLabel = new QLabel(tr("MoviTel: "));
    MoviTelineEdit = new QLineEdit;
    MoviTelCheckBook = new QCheckBox(tr("Recive message"));
    ProTelLabel = new QLabel(tr("company telphone number: "));
    ProTelLineEdit = new QLineEdit;
    mainLayout = new QGridLayout(this);
    mainLayout->setMargin(15);
    mainLayout->setSpacing(10);
    mainLayout->addWidget(EmailLabel,0,0);
    mainLayout->addWidget(EmailLineEdit,0,1);
    mainLayout->addWidget(AddrLabel,1,0);
    mainLayout->addWidget(AddrLineEdit,1,1);
    mainLayout->addWidget(CodeLabel,2,0);
    mainLayout->addWidget(CodeLineEdit,2,1);
    mainLayout->addWidget(MoviTelLabel,3,0);
    mainLayout->addWidget(MoviTelineEdit,3,1);
    mainLayout->addWidget(MoviTelCheckBook,3,2);
    mainLayout->addWidget(ProTelLabel,4,0);
    mainLayout->addWidget(ProTelLineEdit,4,1);
    mainLayout->setSizeConstraint(QLayout::SetFixedSize);
}

继续新建文件,选择C++ class,单击choose,命名为Detail,基类名选择QWidget。
在detail.h文件写入:

#ifndef DETAIL_H
#define DETAIL_H

#include <QWidget>
#include <QLabel>
#include <QComboBox>
#include <QLineEdit>
#include <QGridLayout>
#include <QTextEdit>

class Detail : public QWidget
{
    Q_OBJECT
public:
    explicit Detail(QWidget *parent = 0);

signals:

public slots:

private:
    QLabel *NationalLabel;
    QComboBox *NationalComboBox;
    QLabel *ProvinceLabel;
    QComboBox *ProviceComboBox;
    QLabel *CityLabel;
    QLineEdit *CityLineEdit;
    QLabel *IntroductLabel;
    QTextEdit *IntroductTextEdit;
    QGridLayout *mainLayout;
};

#endif // DETAIL_H

在detail.cpp中写入:

#include "detail.h"

Detail::Detail(QWidget *parent) : QWidget(parent)
{
    NationalLabel = new QLabel(tr("National: "));
    NationalComboBox = new QComboBox;
    NationalComboBox->insertItem(0,tr("China"));
    NationalComboBox->insertItem(1,tr("USA"));
    NationalComboBox->insertItem(2,tr("UK"));
    ProvinceLabel = new QLabel(tr("Province: "));
    ProviceComboBox = new QComboBox;
    ProviceComboBox->insertItem(0,tr("Jiangshu"));
    ProviceComboBox->insertItem(1,tr("Beijing"));
    ProviceComboBox->insertItem(2,tr("Guangzhou"));
    CityLabel = new QLabel(tr("City: "));
    CityLineEdit = new QLineEdit;
    IntroductLabel = new QLabel(tr("Introduct: "));
    IntroductTextEdit = new QTextEdit;
    mainLayout = new QGridLayout(this);
    mainLayout->setMargin(15);
    mainLayout->setSpacing(10);
    mainLayout->addWidget(NationalLabel,0,0);
    mainLayout->addWidget(NationalComboBox,0,1);
    mainLayout->addWidget(ProvinceLabel,1,0);
    mainLayout->addWidget(ProviceComboBox,1,1);
    mainLayout->addWidget(CityLabel,2,0);
    mainLayout->addWidget(CityLineEdit,2,1);
    mainLayout->addWidget(IntroductLabel,3,0);
    mainLayout->addWidget(IntroductTextEdit,3,1);
}

在main.cpp写入:

#include "content.h"
#include <QApplication>
#include <QTextCodec>
#include <QSplitter>
#include <QListWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFont font("AR PL KaitiM GB",12);
    a.setFont(font);

    QSplitter *splitterMain = new QSplitter(Qt::Horizontal,0);
    splitterMain->setOpaqueResize(true);//用于设置分割窗的分割条在拖动时是否为实时更新显示
//在新建的水平分割窗口的左侧窗口插入一个QListWidget作为条目选择框
    QListWidget *list = new QListWidget(splitterMain);
//依次加入baseinfo,contact跟detail三个条目
    list->insertItem(0,QObject::tr("baseinfo"));
    list->insertItem(1,QObject::tr("contact"));
    list->insertItem(2,QObject::tr("detail"));
//在水平分割窗的右侧加入Content对象
    Content *content = new Content(splitterMain);
//连接列表框的currentRowChanged()信号和stack的setCurrentIndex(),此时,
//但点击列表的某一项,返回一个整数,且传到stack的setCurrentIndex中,并显示相应的界面
    QObject::connect(list,SIGNAL(currentRowChanged(int)),content->stack,SLOT(setCurrentIndex(int)));
    splitterMain->setWindowTitle(QObject::tr("Modify Username's Info"));//设置窗口名称
    splitterMain->setMinimumSize(splitterMain->minimumSize());//设置最小化
    splitterMain->setMaximumSize(splitterMain->maximumSize());//设置最大化
    splitterMain->show();
    return a.exec();
}

结果如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值