這是一個簡單的修改用戶資料的例子,在這個例子裏可以看到如何實現一個相對較爲複雜的窗口布局,如何使用分割窗口,如何使用堆棧窗口等,效果圖如下:
代碼的實現有點多,但是我已經盡力備註,方便大家的理解,建議看着效果圖和註釋一起理解這些佈局,要堅持看下去,希望能對你有所幫助,具體代碼如下:
//main.cpp
<span style="font-family:Microsoft YaHei;font-size:18px;">#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 *list=new QListWidget(splitterMain);//在新建的主窗口的左側插入一個QlistWidget作爲條目選擇框
list->insertItem(0,QObject::tr("基本信息"));
list->insertItem(1,QObject::tr("聯繫方式"));
list->insertItem(1,QObject::tr("詳細資料"));
Content *content=new Content(splitterMain);//在水平分割窗的右側窗口中插入content類對象
QObject::connect(list,SIGNAL(currentRowChanged(int)),content->stack,SLOT(setCurrentIndex(int)));//連接列表框中的currentRowChanged()信號與堆棧窗的setCurrentIndex()槽函數
splitterMain->setWindowTitle(QObject::tr("修改用戶資料"));//主佈局的標題
splitterMain->setMinimumSize(splitterMain->minimumSize());//設置主佈局框即水平分割窗的最小尺寸
splitterMain->setMaximumSize(splitterMain->maximumSize());//設置主佈局框的最大尺寸
splitterMain->show();
//Content w;
//w.show();
return a.exec();
}
</span>
<span style="font-family:Microsoft YaHei;font-size:18px;">#include<QStackedWidget>
#include<QPushButton>
#include"baseinfo.h"
#include"contact.h"
#include"detail.h"
#ifndef CONTENT_H
#define CONTENT_H
#include <QDialog>
class Content : public QFrame
{
Q_OBJECT
public:
Content(QWidget *parent = 0);
QStackedWidget *stack;//定義堆棧窗口
QPushButton *AmendBtn;//定義修改鍵
QPushButton *CloseBtn;//定義關閉鍵
BaseInfo *baseInfo;
Contact *contact;
Detail *detail;
~Content();
};
#endif // CONTENT_H
</span>
//content.cpp
<span style="font-family:Microsoft YaHei;font-size:18px;">#include "content.h"
Content::Content(QWidget *parent)
: QFrame(parent)
{
stack =new QStackedWidget(this);//創建一個QStackedWdiget對象
stack->setFrameStyle(QFrame::Panel|QFrame::Raised);//對堆棧窗口的顯示風格進行設置
baseInfo =new BaseInfo;//在堆棧窗口中插入“基本信息”,"聯繫方式“,”詳細資料“
contact =new Contact();
detail =new Detail();
stack->addWidget(baseInfo);//往stack裏添加控件
stack->addWidget(contact);
stack->addWidget(detail);
AmendBtn =new QPushButton(tr("修改"));
CloseBtn =new QPushButton(tr("關閉"));
QHBoxLayout *BtnLayout =new QHBoxLayout;//水平佈局
BtnLayout->addStretch(1);//增加伸縮量,按比例分配空間
BtnLayout->addWidget(AmendBtn);
BtnLayout->addWidget(CloseBtn);//這段代碼用於創建兩個按鈕,並且利用QHBoxLayout對其進行佈局
QVBoxLayout *RightLayout =new QVBoxLayout(this);//對整體進行佈局
RightLayout->setMargin(10);//設置邊緣,佈局與四周的距離
RightLayout->setSpacing(6);//設置間隔,佈局與下邊框的距離
RightLayout->addWidget(stack);
RightLayout->addLayout(BtnLayout);
}
Content::~Content()
{
}
</span>
<span style="font-family:Microsoft YaHei;font-size:18px;">#include<QLabel>
#include<QLineEdit>
#include<QComboBox>
#include<QTextEdit>
#include<QGridLayout>
#include<QPushButton>
#ifndef BASEINFO_H
#define BASEINFO_H
#include <QWidget>
class BaseInfo : public QWidget
{
Q_OBJECT
public:
explicit BaseInfo(QWidget *parent = 0);
private:
//左側
QLabel *UserNameLabel;
QLabel *NameLabel;
QLabel *SexLabel;
QLabel *DepartmentLabel;
QLabel *AgeLabel;
QLabel *OtherLabel;
QLineEdit *UserNameLineEdit;
QLineEdit *NameLineEdit;
QComboBox *SexComboBox;//組合框
QTextEdit *DepartmentTextEdit;
QLineEdit *AgeLineEdit;
QGridLayout *LeftLayout;//網格佈局
//右側
QLabel *HeadLabel; //右上角部分
QLabel *HeadIconLabel;
QPushButton *UpdateHeadBtn;
QHBoxLayout *TopRightLayout;//水平盒佈局
QLabel *IntroductionLabel;
QTextEdit *IntroductionTextEdit;
QVBoxLayout *RightLayout;//垂直盒佈局
signals:
public slots:
};
#endif // BASEINFO_H
</span>
<span style="font-family:Microsoft YaHei;font-size:18px;">#include "baseinfo.h"
BaseInfo::BaseInfo(QWidget *parent) : QWidget(parent)
{
//左側
UserNameLabel =new QLabel(tr("用戶名: "));
UserNameLineEdit =new QLineEdit;
NameLabel =new QLabel(tr("姓名:"));
NameLineEdit = new QLineEdit;
SexLabel = new QLabel(tr("性別:"));
SexComboBox =new QComboBox;
SexComboBox->addItem(tr("女"));
SexComboBox->addItem(tr("男"));
DepartmentLabel =new QLabel(tr("部門:"));
DepartmentTextEdit =new QTextEdit;
AgeLabel =new QLabel(tr("年齡:"));
AgeLineEdit =new QLineEdit;
OtherLabel =new QLabel(tr("備註:"));
OtherLabel ->setFrameStyle(QFrame::WinPanel|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); //其他,Widget(控件名,行,列,佔用行數,佔用列數)。
LeftLayout->setColumnStretch(0,1);//設定兩列分別佔用空間的比例
LeftLayout->setColumnStretch(1,3);
//右側
HeadLabel =new QLabel(tr("頭像:"));
HeadIconLabel =new QLabel;
QPixmap icon(":/new/dog/dog.jpg");
HeadIconLabel->setPixmap(icon);
HeadIconLabel->resize(icon.width(),icon.height());
UpdateHeadBtn =new QPushButton(tr("更新"));
TopRightLayout =new QHBoxLayout();//完成右上側頭像的選擇區的佈局
TopRightLayout ->setSpacing(20);//設定各個控件之間的間距爲20
TopRightLayout ->addWidget(HeadLabel);
TopRightLayout ->addWidget(HeadIconLabel);
TopRightLayout ->addWidget(UpdateHeadBtn);
IntroductionLabel =new QLabel(tr("個人說明:"));
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);//設定對話框的邊距爲15
mainLayout->setSpacing(10);
mainLayout->addLayout(LeftLayout,0,0);
mainLayout->addLayout(RightLayout,0,1);
mainLayout->setSizeConstraint(QLayout::SetFixedSize);//設定最優化顯示
}
</span>
//detail.h
<span style="font-family:Microsoft YaHei;font-size:18px;">#include<QLabel>
#include<QComboBox>
#include<QLineEdit>
#include<QTextEdit>
#include<QGridLayout>
#ifndef DETAIL_H
#define DETAIL_H
#include <QWidget>
class Detail : public QWidget
{
Q_OBJECT
public:
explicit Detail(QWidget *parent = 0);
private:
QLabel *NationalLabel;
QComboBox *NationalComboBox;//聯合佈局
QLabel *ProvinceLabel;
QComboBox *ProvinceComboBox;
QLabel *CityLabel;
QLineEdit *CityLineEdit;
QLabel *IntroductLabel;
QTextEdit *IntroductTextEdit;
QGridLayout *mainLayout;//網絡佈局
signals:
public slots:
};
#endif // DETAIL_H
</span>
<span style="font-family:Microsoft YaHei;font-size:18px;">#include "detail.h"
Detail::Detail(QWidget *parent) : QWidget(parent)
{
NationalLabel =new QLabel(tr("國家:"));
NationalComboBox =new QComboBox;
NationalComboBox ->insertItem(0,tr("中國"));
NationalComboBox ->insertItem(1,tr("美國"));
NationalComboBox ->insertItem(2,tr("英國"));
ProvinceLabel =new QLabel(tr("省份:"));
ProvinceComboBox =new QComboBox;
ProvinceComboBox->insertItem(0,tr("江蘇省"));
ProvinceComboBox->insertItem(1,tr("山東省"));
ProvinceComboBox->insertItem(2,tr("浙江省"));
CityLabel =new QLabel(tr("城市:"));
CityLineEdit =new QLineEdit;
IntroductLabel =new QLabel(tr("個人說明:"));
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(ProvinceComboBox,1,1);
mainLayout->addWidget(CityLabel,2,0);
mainLayout->addWidget(CityLineEdit,2,1);\
mainLayout->addWidget(IntroductLabel,3,0);
mainLayout->addWidget(IntroductTextEdit,3,1);
}
</span>
//contact.h
<span style="font-family:Microsoft YaHei;font-size:18px;">#include<QLabel>
#include<QGridLayout>
#include<QLineEdit>
#include<QCheckBox>
#include<QStackedWidget>
#ifndef CONTACT_H
#define CONTACT_H
#include <QWidget>
class Contact : public QWidget
{
Q_OBJECT
public:
explicit Contact(QWidget *parent = 0);
private:
QLabel *EmailLabel;
QLineEdit *EmialLineEdit;
QLabel *AddrLabel;
QLineEdit *AddrLineEdit;
QLabel *CodeLabel;
QLineEdit *CodeLineEdit;
QLabel *MoviTelLable;
QLineEdit *MoviTelLineEdit;
QCheckBox *MoviTelCheckBook;
QLabel *ProTelLabel;
QLineEdit *ProTelLineEdit;
QGridLayout *mainLayout;
signals:
public slots:
};
#endif // CONTACT_H
</span>
//contact.cpp
<span style="font-family:Microsoft YaHei;font-size:18px;">#include "contact.h"
Contact::Contact(QWidget *parent) : QWidget(parent)
{
EmailLabel =new QLabel(tr("電子郵件:"));
EmialLineEdit =new QLineEdit;
AddrLabel =new QLabel(tr("聯繫地址:"));
AddrLineEdit =new QLineEdit;
CodeLabel =new QLabel(tr("郵政編碼:"));
CodeLineEdit =new QLineEdit(tr("移動電話:"));
MoviTelLable =new QLabel(tr("移動電話:"));
MoviTelLineEdit =new QLineEdit;
MoviTelCheckBook =new QCheckBox(tr("接收留言"));
ProTelLabel =new QLabel(tr("辦公電話:"));
ProTelLineEdit =new QLineEdit;
mainLayout =new QGridLayout(this);
mainLayout->setMargin(15);
mainLayout->setSpacing(10);
mainLayout->addWidget(EmailLabel,0,0);
mainLayout->addWidget(EmialLineEdit,0,1);
mainLayout->addWidget(AddrLabel,1,0);
mainLayout->addWidget(AddrLineEdit,1,1);
mainLayout->addWidget(CodeLabel,2,0);
mainLayout->addWidget(CodeLineEdit,3,1);
mainLayout->addWidget(MoviTelLineEdit,3,1);
mainLayout->addWidget(MoviTelCheckBook,3,2);
mainLayout->addWidget(ProTelLabel,4,0);
mainLayout->addWidget(ProTelLineEdit,4,1);
mainLayout->setSizeConstraint(QLayout::SetFixedSize);
}
</span>