【Qt】修改用戶資料

這是一個簡單的修改用戶資料的例子,在這個例子裏可以看到如何實現一個相對較爲複雜的窗口布局,如何使用分割窗口,如何使用堆棧窗口等,效果圖如下:



代碼的實現有點多,但是我已經盡力備註,方便大家的理解,建議看着效果圖和註釋一起理解這些佈局,要堅持看下去,希望能對你有所幫助,具體代碼如下:

//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>



//content.h

<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>



//baseinfo.h

<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>


//baseinfo.cpp

<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>



//detail.cpp

<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>






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章