如何实现一个复杂的窗口布局,如何实用分割窗口以及堆栈窗口。
实现的目标界面如下:
1.导航页实现
content.h
#ifndef CONTENT_H
#define CONTENT_H
#include <QDialog>
#include <QPushButton>
#include <QStackedWidget>
#include <QWidget>
#include "baseinfo.h"
#include "contact.h"
#include "detail.h"
class Content : public QFrame
{
Q_OBJECT
public:
Content(QWidget *parent = nullptr);
~Content();
// Content(QWidget *parent=0);
public:
QStackedWidget *stack;
QPushButton *btnAmend;
QPushButton *btnClose;
BaseInfo *baseinfo;
Contact *contact;
Detail *detail;
public slots:
void setCurrentIndex(int t_index);
};
#endif // CONTENT_H
content.cpp
#include "content.h"
#include "baseinfo.h"
#include <QDebug>
#include <QHBoxLayout>
#include <QVBoxLayout>
Content::Content(QWidget *parent)
: QFrame(parent)
{
stack=new QStackedWidget(this);
//对堆栈口显式风格进行设置
stack->setFrameStyle(QFrame::Panel|QFrame::Raised);//设置阴影和形状
//创建三个界面
BaseInfo *baseInfo=new BaseInfo(this);
Contact *contact=new Contact(this);
Detail *detail=new Detail(this);
//将创建的三个界面插入堆栈窗体中
stack->addWidget(baseInfo);
stack->addWidget(contact);
stack->addWidget(detail);
//创建堆栈下面的按钮
btnAmend=new QPushButton(QStringLiteral("修改 "));
btnClose=new QPushButton(QStringLiteral("关闭 "));
QHBoxLayout *btnLayout=new QHBoxLayout;
btnLayout->addStretch(1);
btnLayout->addWidget(btnAmend);
btnLayout->addWidget(btnClose);
//堆栈和按钮一起布局
QVBoxLayout *RightLayout=new QVBoxLayout(this);
RightLayout->setMargin(10);
RightLayout->setSpacing(6);
RightLayout->addWidget(stack);
RightLayout->addLayout(btnLayout);
this->setLayout(RightLayout);
}
Content::~Content()
{
}
void Content::setCurrentIndex(int t_index)//这个是我自己定义的
{
//打印一下,看看信号发送的数字0,1,2, 异常结束说明
qDebug()<<"t_index"<<t_index;
stack->setCurrentIndex(t_index);//这句话有问题---发现没有
}
2.修改用户基本信息
(1)显示用户的基本信息
baseinfo.h
#ifndef BASEINFO_H
#define BASEINFO_H
#include <QWidget>
#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QTextEdit>
#include <QComboBox>
#include <QGridLayout>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include<QPushButton>
class BaseInfo : public QWidget
{
public:
explicit BaseInfo(QWidget *parent = nullptr);
private:
//左侧
QLabel *label_UserName;
QLabel *label_Name;
QLabel *label_Sex;
QLabel *label_Age;
QLabel *label_Department;
QLabel *label_Other;
QLineEdit *lineEdit_UserName;
QLineEdit *lineEdit_Name;
QComboBox *combox_Sex;
QTextEdit *textEdit_Department;
QLineEdit *lineEdit_Age;
QGridLayout *Leftlayout;
//右侧
QLabel *label_head;
QLabel *label_headIcon;
QPushButton *btn_updateHead;
QHBoxLayout *TopRightLayout;
QLabel *IntroductionLabel;
QTextEdit *IntroductionTextEdit;
QVBoxLayout *RighetLayout;
//底部
QPushButton *btn_Ok;
QPushButton *btn_Cancel;
QHBoxLayout *ButtomLayout;
signals:
};
#endif // BASEINFO_H
baseinfo.cpp
#include "baseinfo.h"
BaseInfo::BaseInfo(QWidget *parent) : QWidget(parent)
{
setWindowTitle(QStringLiteral("UserInfo"));
//左侧
label_UserName=new QLabel(this);
//label_UserName=new QLabel(QStringLiteral("姓名"),this);
label_Name=new QLabel(this);
label_Sex=new QLabel(this);
label_Age=new QLabel(this);
label_Department=new QLabel(this);
label_Other=new QLabel(this);
lineEdit_UserName=new QLineEdit;
lineEdit_Name=new QLineEdit;
textEdit_Department=new QTextEdit;
lineEdit_Age=new QLineEdit;
combox_Sex=new QComboBox;
combox_Sex->addItem(QStringLiteral(" 女 "));
combox_Sex->addItem(QStringLiteral(" 男 "));
label_Other->setFrameStyle(QFrame::Panel|QFrame::Sunken);
label_UserName->setFixedSize(80,30);
label_Name->setFixedSize(80,30);
label_Sex->setFixedSize(80,30);
label_Age->setFixedSize(80,30);
label_Department->setFixedSize(80,30);
// label_Other->setFixedSize(100,30);
lineEdit_UserName->setFixedSize(320,30);
lineEdit_Name->setFixedSize(320,30);
lineEdit_Age->setFixedSize(320,30);
label_Other->setFixedSize(400,30);
label_UserName->setText(QStringLiteral("用户名: "));
label_Name->setText(QStringLiteral("姓名: "));
label_Sex->setText(QStringLiteral("性别: "));
label_Age->setText(QStringLiteral("年龄: "));
label_Department->setText(QStringLiteral("部门: "));
label_Other->setText(QStringLiteral("备注: "));
//左侧网格布局
QGridLayout *Leftlayout = new QGridLayout;
Leftlayout->addWidget(label_UserName,0,0);
Leftlayout->addWidget(lineEdit_UserName,0,1);
Leftlayout->addWidget(label_Name,1,0);
Leftlayout->addWidget(lineEdit_Name,1,1);
Leftlayout->addWidget(label_Sex,2,0);
Leftlayout->addWidget(combox_Sex,2,1);
Leftlayout->addWidget(label_Department,3,0);
Leftlayout->addWidget(textEdit_Department,3,1);
Leftlayout->addWidget(label_Age,4,0);
Leftlayout->addWidget(lineEdit_Age,4,1);
Leftlayout->addWidget(label_Other,5,0,1,2);
Leftlayout->setColumnStretch(0,1);
Leftlayout->setColumnStretch(1,3);
//右侧
label_head=new QLabel(this);
label_headIcon=new QLabel();
label_headIcon->setPixmap(QPixmap(":/head/head/head.jpg"));
label_headIcon->resize(15,15);
btn_updateHead=new QPushButton(this);
IntroductionLabel=new QLabel(this);
IntroductionTextEdit=new QTextEdit;
label_head->setText(QStringLiteral("头像: "));
btn_updateHead->setText(QStringLiteral("更新 "));
IntroductionLabel->setText(QStringLiteral("个人说明: "));
label_head->setFixedSize(80,30);
btn_updateHead->setFixedSize(120,30);
IntroductionLabel->setFixedSize(120,30);
//右侧头像定义布局
QHBoxLayout *TopRightLayout=new QHBoxLayout();
TopRightLayout->setSpacing(20);
TopRightLayout->addWidget(label_head);
TopRightLayout->addWidget(label_headIcon);
TopRightLayout->addWidget(btn_updateHead);
//完成右侧的布局
QVBoxLayout* RighetLayout=new QVBoxLayout();
RighetLayout->setMargin(10);
RighetLayout->addLayout(TopRightLayout);
RighetLayout->addWidget(IntroductionLabel);
RighetLayout->addWidget(IntroductionTextEdit);
//底部
btn_Ok=new QPushButton(this);
btn_Cancel=new QPushButton(this);
btn_Ok->setText(QStringLiteral("确定 "));
btn_Cancel->setText(QStringLiteral("取消 "));
btn_Ok->setFixedSize(120,30);
btn_Cancel->setFixedSize(120,30);
QHBoxLayout *ButtomLayout=new QHBoxLayout();
ButtomLayout->addStretch();
ButtomLayout->addWidget(btn_Ok);
ButtomLayout->addWidget(btn_Cancel);
//开辟一个界面,将左边整体放入大的界面中
QWidget *pWidgetLeft = new QWidget(this);
pWidgetLeft->setLayout(Leftlayout);
//开辟一个界面,将右边整体放入大的界面中
QWidget *pWidgetRight = new QWidget(this);
pWidgetRight->setLayout(RighetLayout);
//开辟一个界面,将右边整体放入大的界面中
QWidget *pWidgetBottom = new QWidget(this);
pWidgetBottom->setLayout(ButtomLayout);
//左右两个大的界面平行
QHBoxLayout *TopLRLayout=new QHBoxLayout();
TopLRLayout->addWidget(pWidgetLeft);
TopLRLayout->addWidget(pWidgetRight);
QVBoxLayout* BottomLayout=new QVBoxLayout();
BottomLayout->addLayout(TopLRLayout);
BottomLayout->addWidget(pWidgetBottom);
this->setLayout(BottomLayout);
//字体样式
QString strLableStyle4 = "color: rgb(0, 0, 0);" //黑色字体
"font-family: Microsoft YaHei;"
"font-size: 16px;"
"font-weight: bold;";
label_UserName->setStyleSheet(strLableStyle4);
label_Name->setStyleSheet(strLableStyle4);
label_Sex->setStyleSheet(strLableStyle4);
label_Age->setStyleSheet(strLableStyle4);
label_Department->setStyleSheet(strLableStyle4);
label_Other->setStyleSheet(strLableStyle4);
label_head->setStyleSheet(strLableStyle4);;
label_headIcon->setStyleSheet(strLableStyle4);
btn_updateHead->setStyleSheet(strLableStyle4);
IntroductionLabel->setStyleSheet(strLableStyle4);
btn_Ok->setStyleSheet(strLableStyle4);
btn_Cancel->setStyleSheet(strLableStyle4);
}
(2)显示用户的联系方式
contact.h
#ifndef CONTACT_H
#define CONTACT_H
#include <QMainWindow>
#include <QWidget>
#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QTextEdit>
#include <QComboBox>
#include <QGridLayout>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QPushButton>
#include <QCheckBox>
class Contact : public QWidget
{
Q_OBJECT
public:
explicit Contact(QWidget *parent = nullptr);
//Contact(QWidget *parent=0);
signals:
private:
QLabel *labEmail;
QLineEdit *lineEmail;
QLabel *labAddr;
QLineEdit *lineAddr;
QLabel *labCode;
QLineEdit *lineCode;
QLabel *labMoviTel;
QLineEdit *lineMoviTel;
QCheckBox *chbokMoviTel;
QLabel *labProTel;
QLineEdit *lineProTel;
};
#endif // CONTACT_H
contact.cpp
#include "contact.h"
Contact::Contact(QWidget *parent) : QWidget(parent)
{
labEmail=new QLabel(this);
lineEmail=new QLineEdit;
labAddr=new QLabel(this);
lineAddr=new QLineEdit;
labCode=new QLabel(this);
lineCode=new QLineEdit;
labMoviTel=new QLabel(this);
lineMoviTel=new QLineEdit;
chbokMoviTel=new QCheckBox;
labProTel=new QLabel(this);
lineProTel=new QLineEdit;
labEmail->setFixedSize(80,30);
lineEmail->setFixedSize(80,30);
labAddr->setFixedSize(80,30);
lineAddr->setFixedSize(80,30);
labCode->setFixedSize(80,30);
lineCode->setFixedSize(80,30);
labMoviTel->setFixedSize(80,30);
lineMoviTel->setFixedSize(80,30);
chbokMoviTel->setFixedSize(80,30);
labProTel->setFixedSize(80,30);
lineProTel->setFixedSize(80,30);
labEmail->setText(QStringLiteral("电子邮件:"));
labAddr->setText(QStringLiteral("联系地址:"));
labCode->setText(QStringLiteral("邮政编码:"));
labMoviTel->setText(QStringLiteral("移动电话:"));
chbokMoviTel->setText(QStringLiteral("接收留言:"));
labProTel->setText(QStringLiteral("办公电话:"));
QGridLayout *mainLayout=new QGridLayout(this);
mainLayout->setMargin(15);
mainLayout->setSpacing(10);
mainLayout->addWidget(labEmail,0,0);
mainLayout->addWidget(lineEmail,0,1);
mainLayout->addWidget(labAddr,1,0);
mainLayout->addWidget(lineAddr,1,1);
mainLayout->addWidget(labCode,2,0);
mainLayout->addWidget(lineCode,2,1);
mainLayout->addWidget(labMoviTel,3,0);
mainLayout->addWidget(lineMoviTel,3,1);
mainLayout->addWidget(chbokMoviTel,3,2);
mainLayout->addWidget(labProTel,4,0);
mainLayout->addWidget(lineProTel,4,1);
mainLayout->setSizeConstraint(QLayout::SetFixedSize);
this->setLayout(mainLayout);
}
(3)显示用户的详细资料
detail.h
#ifndef DETAIL_H
#define DETAIL_H
#include <QWidget>
#include <QMainWindow>
#include <QWidget>
#include <QWidget>
#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QTextEdit>
#include <QComboBox>
#include <QGridLayout>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QPushButton>
#include <QCheckBox>
class Detail : public QWidget
{
Q_OBJECT
public:
explicit Detail(QWidget *parent = nullptr);
//Detail (QWidget *parent=0);
signals:
private:
QLabel *labNational;
QComboBox *comboxNational;
QLabel *labProvince;
QComboBox *comboxProvince;
QLabel *labCity;
QLineEdit *lineCity;
QLabel *labIntruction;
QTextEdit *textIntruction;
};
#endif // DETAIL_H
detail.cpp
#include "detail.h"
Detail::Detail(QWidget *parent) : QWidget(parent)
{
labNational =new QLabel(this);
comboxNational=new QComboBox(this);
labProvince=new QLabel(this);
comboxProvince=new QComboBox(this);;
labCity=new QLabel(this);;
lineCity=new QLineEdit(this);
labIntruction=new QLabel(this);
textIntruction=new QTextEdit(this);
labNational->setFixedSize(70,30);
comboxNational->setFixedSize(500,30);
labProvince->setFixedSize(70,30);
comboxProvince->setFixedSize(500,30);
labCity->setFixedSize(70,30);
lineCity->setFixedSize(500,30);
labIntruction->setFixedSize(70,30);
textIntruction->setFixedSize(500,400);
labNational->setText(QStringLiteral("国家/地址:"));
comboxNational->insertItem(0,QStringLiteral("中国"));
comboxNational->insertItem(1,QStringLiteral("美国"));
comboxNational->insertItem(2,QStringLiteral("英国"));
labProvince->setText(QStringLiteral("省份:"));
comboxProvince->insertItem(0,QStringLiteral("江苏省"));
comboxProvince->insertItem(1,QStringLiteral("山东省"));
comboxProvince->insertItem(2,QStringLiteral("浙江省"));
labCity->setText(QStringLiteral("城市:"));
labIntruction->setText(QStringLiteral("个人说明:"));
QGridLayout *mainLayout=new QGridLayout(this);
mainLayout->setMargin(15);
mainLayout->setSpacing(10);
mainLayout->addWidget(labNational,0,0);
mainLayout->addWidget(comboxNational,0,1);
mainLayout->addWidget(labProvince,1,0);
mainLayout->addWidget(comboxProvince,1,1);
mainLayout->addWidget(labCity,2,0);
mainLayout->addWidget(lineCity,2,1);
mainLayout->addWidget(labIntruction,3,0);
mainLayout->addWidget(textIntruction,3,1);
this->setLayout(mainLayout);
}
最外层是一个分割窗体QSplitter,分割窗体的左侧是一个QListWidget,右侧是一个QVBoxLayout布局,此布局包括一个堆栈窗体QStackWidget和一个按钮布局。堆栈窗体QStackWidget中包含三个窗体,每个窗体采用基本的布局方式进行布局管理。