1. 程式人生 > >Qt5佈局管理例項(含程式碼及簡介)

Qt5佈局管理例項(含程式碼及簡介)

一、例項效果

                                                      (a)“基本資訊頁面”

                                                       (b)"聯絡方式“頁面

                                                           (c)“詳細資料”頁面

原始碼

baseinfo.h

#ifndef BASEINFO_H
#define BASEINFO_H

#include <QWidget>

#include<QLabel>
#include<QLineEdit>
#include<QComboBox>
#include<QTextEdit>
#include<QGridLayout>
#include<QPushButton>
//#include<QPixmap>
//#include<QImage>

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

signals:

public slots:
private:
    //左側
    QLabel *UserNameLabel;
    QLabel *NameLabel;
    QLabel *SexLabel;
    QLabel *DepartmentLabel;
    QLabel *AgeLabel;
    QLabel *OtherLabel;
    QLineEdit *UserNameLineEdit;
    QLineEdit *NameLineEdit;
    QComboBox *SexComBox;
    QTextEdit *DepartmentTextEdit;
    QLineEdit *AgeLineEdit;
    QGridLayout *LeftLayout;
    //右側
    QLabel *HeadLabel;   //右上角部分
    QLabel *HeadIconLabel;
    QPushButton *UpdateHeadBtn;
    QHBoxLayout *TopRightLayout;
    QLabel *IntroductionLabel;
    QTextEdit *IntroductionTextEdit;
    QVBoxLayout *RightLayout;
};

#endif // BASEINFO_H


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 = nullptr);

signals:

public slots:

private:
    QLabel *EmailLabel;
    QLineEdit *EmailLineEdit;
    QLabel *AddrLabel;
    QLineEdit *AddrlineEdit;
    QLabel *CodeLabel;
    QLineEdit *CodeLineEdit;
    QLabel *MoviTelLabel;
    QLineEdit *MoviTelEdit;
    QCheckBox *MoviTelCheckBook;
    QLabel *ProTelLabel;
    QLineEdit *ProTelLineEdit;
    QGridLayout *mainLayout;
};


#endif // CONTACT_H

content.h

#ifndef CONTENT_H
#define CONTENT_H

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

#include <QDialog>

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

detail.h

#ifndef DETAIL_H
#define DETAIL_H

#include <QWidget>

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


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

signals:

public slots:

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


#endif // DETAIL_H

baseinfo.cpp

#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("性別"));
    SexComBox=new QComboBox;
    SexComBox->addItem(tr("女"));
    SexComBox->addItem(tr("男"));
    DepartmentLabel=new QLabel(tr("部門"));
    DepartmentTextEdit=new QTextEdit;
    AgeLabel=new QLabel(tr("年齡"));
    AgeLineEdit=new QLineEdit;
    OtherLabel=new QLabel(tr("備註"));
    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(SexComBox,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(0,3);
    /****右側*****/
    HeadLabel=new QLabel(tr("頭像:"));//右上角部分
    HeadIconLabel=new QLabel;
    QPixmap icon("head.png");
    HeadIconLabel->setPixmap(icon);
    HeadIconLabel->resize(icon.width(),icon.height());
    UpdateHeadBtn=new QPushButton(tr("更新"));
    TopRightLayout=new QHBoxLayout();
    TopRightLayout->setSpacing(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);
    mainLayout->setSpacing(10);
    mainLayout->addLayout(LeftLayout,0,0);
    mainLayout->addLayout(RightLayout,0,1);
    mainLayout->setSizeConstraint(QLayout::SetFixedSize);

}

contact.cpp

#include "contact.h"

Contact::Contact(QWidget *parent) : QWidget(parent)
{
  EmailLabel=new QLabel(tr("電子郵件:"));
  EmailLineEdit=new QLineEdit;
  AddrLabel= new QLabel(tr("聯絡地址:"));
  AddrlineEdit= new QLineEdit;
  CodeLabel=new QLabel(tr("郵政編碼"));
  CodeLineEdit=new QLineEdit;
  MoviTelLabel=new QLabel(tr("行動電話"));
  MoviTelEdit=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(EmailLineEdit,0,1);
 //mainLayout->addWidget(AddrLabel,1,1,0);//此時新增未顯示出來引數錯誤了
  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(MoviTelEdit,3,1);
  mainLayout->addWidget(MoviTelCheckBook,3,2);
  mainLayout->addWidget(ProTelLabel,4,0);
  mainLayout->addWidget(ProTelLineEdit,4,1);
  mainLayout->setSizeConstraint(QLayout::SetFixedSize);

}

content.cpp

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

Content::Content(QWidget *parent)
    : QFrame(parent)
{
    stack=new QStackedWidget(this);//建立一個QStackedWidget物件
    //對堆疊視窗的顯示風格進行設定
    stack->setFrameStyle(QFrame::Panel|QFrame::Raised);
    /*插入三個頁面*/              //(a)  /*(a)這段程式碼是在堆疊視窗中順序插入“基本資訊”、“聯絡方式”及“詳細資料”三個頁面。其中,BaseInfo類的具體完成程式碼參照3.4節*/
    baseInfo =new BaseInfo();
    contact=new Contact();
    detail=new Detail();
    stack->addWidget(baseInfo);
    stack->addWidget(contact);
    stack->addWidget(detail);
    /*建立兩個按鈕*/                  //(b) /*(b)z這段程式碼用於建立兩個按鈕,並利用QHBoxLayout對其進行佈局。
    AmendBtn =new QPushButton(tr("修改"));
    CloseBtn=new QPushButton(tr("關閉"));
    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()
{

}

detail.cpp

#include "detail.h"

Detail::Detail(QWidget *parent) : QWidget(parent)
{
    NationaLabel =new QLabel(tr("國家/地址"));
    NationalComboBox=new QComboBox;
    NationalComboBox->insertItem(0,tr("中國"));
    NationalComboBox->insertItem(1,tr("美國"));
    NationalComboBox->insertItem(2,tr("英國"));
    ProvinceLabel=new QLabel(tr("省份"));
    ProvinceCombox=new QComboBox;
    ProvinceCombox->insertItem(0,tr("江蘇省"));
    ProvinceCombox->insertItem(1,tr("山東省"));
    ProvinceCombox->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(NationaLabel,0,0);
    mainLayout->addWidget(NationalComboBox,0,1);
    //mainLayout->addWidget(NationaLabel,1,0);如果重複新增則先前新增的無效,具體看參考文件應該有詳細資訊
    mainLayout->addWidget(ProvinceLabel,1,0);
    mainLayout->addWidget(ProvinceCombox,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);//呼叫setOpaqueResize(bool)方法用於設定分割視窗的分割條在拖曳時是否為實時更新顯示,
                                        // 若設為true則實時更新顯示,若設為false則在拖曳時只顯示一條灰色的粗線條,在拖曳到位並釋放滑鼠後再顯示分割條。。
    QListWidget *list=new QListWidget(splitterMain);//(a)在新建的水平分割窗的左側視窗中插入一個QListWidget作為條目選擇框,並在此依次插入“基本資訊”、"聯絡方式“及”詳細資料條目。
    list->insertItem(0,QObject::tr("基本資訊"));
    list->insertItem(1,QObject::tr("聯絡方式"));
    list->insertItem(2,QObject::tr("詳細資料"));
    Content *content=new Content(splitterMain); //(b)在新建的水平分割窗的左側視窗中插入Content類物件。
    QObject::connect(list,SIGNAL(currentRowChanged(int)),content->stack,//(c)//(c)連線列表框的currentRowChange()訊號與堆疊視窗的setCurrentIndex()槽函式
    SLOT(setCurrentIndex(int)));
    //設定主佈局框即水平分割視窗的標題
    splitterMain->setWindowTitle(QObject::tr("修改使用者資料"));
    //設定主佈局框即水平分割視窗的最小尺寸
    splitterMain->setMinimumSize(splitterMain->minimumSize());
    //設定主佈局框即水平分割視窗的最小尺寸
    splitterMain->setMaximumSize(splitterMain->maximumSize());
    splitterMain->show();








    //Content w;
   // w.show();

    return a.exec();
}

總結

總結:通過該例項基本掌握了Qt佈局管理的相關使用方法;相關方法總結及實際除錯時遇到的錯誤在程式碼片段中給出;

1.圖片格式問題

當設定圖片時尤其應該注意圖片格式相關問題 具體應該參考文件(除錯時遇到錯誤,以為是圖片出錯了,後來查明並不是,但查閱資料時發現格式確實是個大問題)

下面給出可能遇到的情況和方法(QPixamp使用時可以參考以下介紹)

在 qt中載入某些 png圖片會出現:libpng warning: iCCP: known incorrect sRGB profile   告警資訊。

雖然沒什麼影響,但是總看到這個警告非常的不舒服

這個警告貌似是和png圖片的格式有關。

解決辦法:

是用QImage讀取一下,然後直接儲存回去就可以了。

 例子:

QImage img;

img.load("*.png");

img.save("*.png");

這樣一次處理過後以後在使用圖片就不會再有以上的告警提示。

2.當為建立物件時,新增物件時 指標訪問出錯 程式報錯:

The process was ended forcefully.

E:/Qt study/MyQtBookCode/CH305/build-Example-Desktop_Qt_5_11_0_MinGW_32bit-Debug/debug/Example.exe crashed.

解決方法:通過除錯介面發現問題修改 快捷鍵F5

3.addWidget()方法使用時,引數填寫錯誤or不完整//此時程式正常 但是顯示效果與預期有出入

解決方法:Ctrl+F 尋找相關定義 及方法使用部分 檢視是否遺漏

資源

本文程式碼資源及《Qt5開發及例項》隨書資源連結:

當然以上是在程式碼編輯時出現的問題 使用設計師進行設計時 此類錯誤的發生能夠減少或避免(目前Qt學習中,所以還是一步一步的踏結實了 )

希望以上內容能給到大家幫助,有錯誤的的地方還望指出