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();
}
结果如下图所示: