Qt5——布局管理


本文参考电子工业出版社出版的《Qt5开发及实例》第三章内容,总结了Qt5中关于布局管理的使用方法。主要分为分割窗口QSplitter类、停靠窗口QDockWidget类及堆栈窗口QStackedWidget类三种情况的使用。

分割窗口QSplitter类

分割窗口QSplitter类在应用程序中经常用到,它可以灵活分割窗口的布局,经常用在类似文件资源管理器的窗口设计中。

示例

  • 新建一个QtWidgetsApplication项目,取消“创建界面”复选框。
  • 在main.cpp文件中修改成如下代码:
#include "mainwindow.h"
#include <QApplication>
#include <QSplitter>
#include <QTextEdit>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QFont font("ZYSong18030", 12);
    a.setFont(font);
    //主分割窗口
    //新建一个QSplitter类对象,作为主分割窗口,设定此分割窗口为水平分割窗口
    QSplitter *splitterMain = new QSplitter(Qt::Horizontal, 0);
    //新建一个QTextEdit类对象,并将其插入主分割窗口中。
    QTextEdit *texteft = new QTextEdit(QObject::tr("Left Widget"), splitterMain);
    //设定TextEdit中文字的对齐复方石,常用有
    //Qt::AlignLeft-做对齐;Qt::AlignRight-右对齐;Qt::AlignCenter-文字居中。
    //Qt::AlignUp-文字与顶端对齐;Qt::AlignBotton:文字与底端对齐。
    texteft->setAlignment(Qt::AlignCenter);

    //右分割窗口
    //新建一个QSplitter类对象,作为右分割窗口,设定此分割窗口为垂直分割窗口,并以主分割窗口为父窗口。
    QSplitter *splitterRight = new QSplitter(Qt::Vertical, splitterMain);
    //设定分割窗口的分隔条在拖拽时是否为实时更新显示,为true则实时更新,false则在拖拽到位并释放鼠标后更新显示,默认为true。
    splitterRight->setOpaqueResize(false);
    QTextEdit *textup = new QTextEdit(QObject::tr("Top Widget"), splitterRight);
    textup->setAlignment(Qt::AlignCenter);
    QTextEdit *textBottom = new QTextEdit(QObject::tr("Bottom Widget"), splitterRight);
    textBottom->setAlignment(Qt::AlignCenter);

    //设定可伸缩控件,第一个参数为指定设置的控件序号(序号按控件插入顺序从0逐步增加);
    //第二个参数为大于0的值,表示为可伸缩控件。
    //序号1的控件为右分割窗口,当整个对话框的宽度发送变化后,左边窗口的宽度不变,右边会随拉伸而改变。
    splitterMain->setStretchFactor(1, 1);
    splitterMain->setWindowTitle(QObject::tr("Splitter"));
    splitterMain->show();

//    MainWindow w;
//    w.show();

    return a.exec();
}

  • 执行结果如下:
    在这里插入图片描述在这里插入图片描述

停靠窗口QDockWidget类

停靠窗口QDockWidget类也是应用程序中经常用到的,设置停靠窗口的一般流程如下:

  • 创建一个QDockWidget对象的停靠窗体。
  • 设置此停靠窗体的属性,通常调用setFeatures()及setAllowedAreas()两种方法。
  • 新建一个要插入停靠窗体的控件,常用的有QListWidget和QTextEdit。
  • 将控件插入停靠窗体,调用QDockWidget的setWidget()方法。
  • 使用addDockWidget()方法在MainWindow中加入此停靠窗体。

示例

  • 新建QtWidgetApplication项目,基类选择“QMainWindow”,取消“创建界面”复选框。
  • mainWindow.h文件代码如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
};

#endif // MAINWINDOW_H

  • 打开MainWindow.cpp文件,添加实现窗口的初始化及功能实现。具体如下:
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle(tr("DockWindows"));
    QTextEdit *te = new QTextEdit(this);
    te->setText(tr("Main Window"));
    te->setAlignment(Qt::AlignCenter);

    //停靠窗口1
    QDockWidget *dock = new QDockWidget(tr("DockWindow1"), this);
/*
 * void setFeatures(DockWidgetFeatures features);
 * 参数指定停靠窗体的特性,包括以下几种参数:
 * QDockWidget::DockWidgetClosable:停靠窗体可关闭。
 * QDockWidget::DockWidgetMovable:停靠窗体可移动。
 * QDockWidget::DockWidgetFloatable:停靠窗体可浮动。
 * QDockWidget::AllDockWidgetFeatures:此参数表示拥有停靠窗体的所有特性。
 * QDockWidget::NoDockWidgetFeatures:不可一定、不可关闭、不可浮动。
*/
    dock->setFeatures(QDockWidget::DockWidgetMovable);
/*
 * void setAllowedAreas(Qt::DockWidgetAreas areas);
 * 参数指定了停靠窗体可停靠的区域,包括以下几种参数:
 * Qt::LeftDockWidgetArea:可在主窗口的左侧停靠。
 * Qt::RightDockWidgetArea:可在主窗口的右侧停靠。
 * Qt::TopDockWidgetArea:可在主窗口的顶端停靠。
 * Qt::BottomDockWidgetArea:可在主窗口的底部停靠。
 * Qt::AllDockWidgetArea:可在主窗口任意部位停靠。
 * Qt::NoDockDockWidgetArea:只能停靠在插入处。
*/
    dock->setAllowedAreas(Qt::LeftDockWidgetArea |Qt::RightDockWidgetArea);
    QTextEdit *te1 = new QTextEdit();
    te1->setText(tr("Window1, The dock widget can be moved between docks by the user" ""));
    dock->setWidget(te1);
    addDockWidget(Qt::RightDockWidgetArea, dock);

    //停靠窗口2
    dock = new QDockWidget(tr("DockWindow2"), this);
    dock->setFeatures(QDockWidget::DockWidgetClosable |QDockWidget::DockWidgetFloatable);
    QTextEdit *te2 = new QTextEdit();
    te2->setText(tr("Window2, The dock widget can be detached from the main window,""and float as an independent window, and can be closed"));
    dock->setWidget(te2);
    addDockWidget(Qt::RightDockWidgetArea, dock);

    //停靠窗口3
    dock = new QDockWidget(tr("DockWindow3"), this);
    dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
    QTextEdit *te3 = new QTextEdit();
    te3->setText(tr("Window3, The dock widget can be closed, moved, and floated"));
    dock->setWidget(te3);
    addDockWidget(Qt::RightDockWidgetArea, dock);
}

MainWindow::~MainWindow()
{

}

  • 执行结果:
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

堆栈窗体QStackedWidget类

堆栈窗体QStackedWidget类也是应用程序中经常用到的。在实际应用中,堆栈窗体多与列表框QListWidget及下拉列表框QComboBox配合使用。

示例

  • 新建Qt Widget Application,选择基类“QDialog”,类名命名为“StackDlg”,取消“创建界面”复选框。
  • 打开“stackdlg.h”,添加如下代码:
#ifndef STACKDLG_H
#define STACKDLG_H

#include <QDialog>
#include <QListWidget>
#include <QStackedWidget>
#include <QLabel>

class StackDlg : public QDialog
{
    Q_OBJECT

public:
    StackDlg(QWidget *parent = 0);
    ~StackDlg();

private:
    QListWidget *list;
    QStackedWidget *stack;
    QLabel *label1;
    QLabel *label2;
    QLabel *label3;
};

#endif // STACKDLG_H

  • 打开“stackdlg.cpp”文件,添加如下代码:
#include "stackdlg.h"

StackDlg::StackDlg(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle(tr("StackedWidget"));
    //新建一个QListWidget控件对象
    list = new QListWidget(this);
    //在新建的QListWidget控件中插入三个条目,作为选择项
    list->insertItem(0, tr("Window1"));
    list->insertItem(1, tr("Window2"));
    list->insertItem(2, tr("Window3"));
    //创建三个QLabel标签控件对象,作为堆栈窗口需要显示的三层窗体。
    label1 = new QLabel(tr("WindowTest1"));
    label2 = new QLabel(tr("WindowTest2"));
    label3 = new QLabel(tr("WindowTest3"));

    //新建一个QStackWidget堆栈窗体对象。
    stack = new QStackedWidget(this);
    //将三个QLabel标签空气依次插入堆栈窗体中。
    stack->addWidget(label1);
    stack->addWidget(label2);
    stack->addWidget(label3);

    QHBoxLayout *mainLayout = new QHBoxLayout(this);
    //对整个对话框进行布局。
    //设定对话框的边距
    mainLayout->setMargin(5);
    //设定各个控件之间的间距
    mainLayout->setSpacing(5);
    mainLayout->addWidget(list);
    mainLayout->addWidget(stack, 0, Qt::AlignHCenter);
    //设定可伸缩控件,第一个参数指定设置的控件,第二个参数值大于0表示可伸缩。
    mainLayout->setStretchFactor(list, 1);
    mainLayout->setStretchFactor(stack, 3);

    //将QListWidget的currentRowChanged()信号与堆栈窗体的setCurrentIndex()槽函数连接起来。
    //实现按选择显示窗体,此时的对战窗体index按插入顺序从0依次排序。
    connect(list, SIGNAL(currentRowChanged(int)), stack, SLOT(setCurrentIndex(int)));

}

StackDlg::~StackDlg()
{

}

  • 执行结果
    在这里插入图片描述在这里插入图片描述

基本布局(QLayout)

Qt提供了QHBoxLayout类、QVBoxLayout类及QGridLayout类等的基本布局管理,分别是水平排列布局,垂直排列布局和网格排列布局。

它们之间的继承关系如下

子类
子类
子类
子类
QLayout
QBoxLayout
QGridLayout
QHBoxLayout
QVBoxLayout

布局中常用方法有addWidget() 和 addLayout()。

addWidget()方法用于加入需要布局的控件:

void addWidget
(	QWidget *widget, //需要插入的控件对象
	int fromRow,	//插入的行
	int fromColumn,	//插入的列
	int rowSpan,	//表示占用的行数
	int columnSpan,	//表示占用的列数
	Qt::Alignment alignment = 0	//描述各个控件的对齐方式
)

addLayout() 方法用于加入子布局:

void addLayout
(	QLayout *layout,	//表示需要插入的子布局对象
	int row,	//插入的起始行
	int column,	//插入的起始列
	int rowSpan,	//表示占用的行数
	int columnSpan,	//表示占用的列数
	Qt::Alignment alignment = 0	//指定对齐方式
)

示例

  • 新建Qt Widgets Application,项目名称为“UserInfo”,基类选择QDialog,取消“创建界面”复选框。
  • 打开“dialog.h”头文件,声明对话框中的各个控件,添加如下代码:
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QGridLayout>
#include <QPushButton>
#include <QBoxLayout>
#include <QTextEdit>
#include <QComboBox>


class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();

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;

    //底部
    QPushButton *OKBtn;
    QPushButton *CancelBtn;
    QHBoxLayout *ButtomLayout;

};

#endif // DIALOG_H

  • 打开“dialog.cpp”文件,在构造函数中添加如下代码:
#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle(tr("UserInfo"));
    //-----------左侧--------
    UserNameLabel = new QLabel(tr("用户名:"));
    UserNameLineEdit = new QLineEdit;
    NameLabel = new QLabel(tr("姓名:"));
    NameLineEdit = new QLineEdit;
    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("备注:"));
    //设定控件风格,setFrameStyle()是QFrame的方法。参数指定由形状(shape)和阴影(shadow)配合设定
    //六种形状:NoFrame、Panel、Box、HLine、VLine及WinPanel;
    //三种阴影:Plain、Raised及Sunken。
    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);
    //setColumnStretch()设定占用空间比例。
    //第一列和第二列比例为1:3.即使对话框框架大小改变,该比例也不会改变
    LeftLayout->setColumnStretch(0, 1);
    LeftLayout->setColumnStretch(1, 3);

    //-------------右侧----------
    HeadLabel = new QLabel(tr("头像:"));
    HeadIconLabel = new QLabel;
    QPixmap icon("321.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);

    //--------------底部--------------
    OKBtn = new QPushButton(tr("确定"));
    CancelBtn = new QPushButton(tr("取消"));
    //完成下面两个按钮的布局
    ButtomLayout = new QHBoxLayout();
    //在按钮之前插入一个占位符,是的两个按钮靠右对齐,并且整个对话框大小改变时按钮大小不改变。
    ButtomLayout->addStretch();
    ButtomLayout->addWidget(OKBtn);
    ButtomLayout->addWidget(CancelBtn);

    //------------------总体布局----------------
    //实现主布局,指定父窗口(this),也可以调用 this->setLayout(mainLayout)实现。
    QGridLayout *mainLayout = new QGridLayout(this);
    mainLayout->setMargin(15);
    mainLayout->setSpacing(10);
    mainLayout->addLayout(LeftLayout, 0, 0);
    mainLayout->addLayout(RightLayout, 0, 1);
    mainLayout->addLayout(ButtomLayout, 1, 0, 1, 2);
    //设定最优化显示,并且用户无法改变对话框大小
    mainLayout->setSizeConstraint(QLayout::SetFixedSize);

}

Dialog::~Dialog()
{

}

  • 执行结果
    在这里插入图片描述
    在这里插入图片描述

“修改用户资料” 实例实现

实现一个综合示例“修改用户资料”的项目,效果如下:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
可以看到,在主界面上最左侧有一个文本选择框,根据选择不同切换不同界面,一共具有三个主要界面:详细信息界面、联系方式界面、详细资料界面。

实现步骤

导航页实现

  • 新建QtWidgetApplication项目,选择基类“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"

Content::Content(QWidget *parent)
    : QFrame (parent)
{
    //创建一个QStackWidget对象
    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("修改"));
    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()
{

}

“基本信息”页面实现

在该工程添加新类,右键点击项目选择“添加新文件…”,选择“C++ Class”选项,单击“Choose…”按钮。
选择基类“QWidget”,类命名为“BaseInfo”点击完成创建。

  • baseinfo.h
#ifndef BASEINFO_H
#define BASEINFO_H

#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QTextEdit>
#include <QGridLayout>
#include <QPushButton>
#include <QWidget>
#include <QVBoxLayout>

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 *SexComboxBox;
    QTextEdit *DepartmentTextEdit;
    QLineEdit *AgeLineEdit;
    QGridLayout *LeftLayout;

    //右侧
    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)
{
    //---------左侧-------
    UserNameLabel = new QLabel(tr("用户名:"));
    UserNameLineEdit = new QLineEdit;
    NameLabel = new QLabel(tr("姓名:"));
    NameLineEdit = new QLineEdit;
    SexLabel = new QLabel(tr("性别:"));
    SexComboxBox = new QComboBox;
    SexComboxBox->addItem(tr("女"));
    SexComboxBox->addItem(tr("男"));
    DepartmentLabel = new QLabel(tr("部门:"));
    DepartmentTextEdit = new QTextEdit;
    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(SexComboxBox, 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, 0, 1);
    LeftLayout->setColumnStretch(0, 1);
    LeftLayout->setColumnStretch(1, 3);

    //-----------右侧-----------
    HeadLabel = new QLabel(tr("头像"));
    HeadIconLabel = new QLabel;
    QPixmap icon("321.bmp");
    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”。

  • contact.h
#ifndef CONTACT_H
#define CONTACT_H

#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QCheckBox>
#include <QGridLayout>

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 *MoviTelLineEdit;
    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("电子邮件:"));
    EmailLineEdit = new QLineEdit;
    AddrLabel = new QLabel(tr("联系地址:"));
    AddrLineEdit = new QLineEdit;
    CodeLabel = new QLabel(tr("邮政编码:"));
    CodeLineEdit = new QLineEdit;
    MoviTelLabel = 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(EmailLineEdit, 0, 1);
    mainLayout->addWidget(AddrLabel, 1, 0);
    mainLayout->addWidget(AddrLineEdit, 1, 1);
    mainLayout->addWidget(CodeLabel, 2, 0);
    mainLayout->addWidget(CodeLabel, 2, 1);
    mainLayout->addWidget(MoviTelLabel, 3, 0);
    mainLayout->addWidget(MoviTelLabel, 3, 1);
    mainLayout->addWidget(MoviTelCheckBook, 3, 2);
    mainLayout->addWidget(ProTelLabel, 4, 0);
    mainLayout->addWidget(ProTelLineEdit, 4, 1);
    mainLayout->setSizeConstraint(QLayout::SetFixedSize);
}

“详细资料”页面实现

再次添加新的类文件,命令类为“Detail”。具体实现如下:

  • 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 *NationalLabel;
    QComboBox *NationalComboBox;
    QLabel *ProvinceLabel;
    QComboBox *ProvinceComboBox;
    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("国家/地址:"));
    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);

}

主函数实现

下面编写工程的入口函数,即main.cpp的实现。

  • 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 *list = new QListWidget(splitterMain);
    list->insertItem(0, QObject::tr("基本信息"));
    list->insertItem(1, QObject::tr("联系方式"));
    list->insertItem(2, QObject::tr("详细资料"));
    Content *content = new Content(splitterMain);
    QObject::connect(list, SIGNAL(currentRowChanged(int)), content->stack, SLOT(setCurrentIndex(int)));
    //设置主布局框的标题
    splitterMain->setWindowTitle(QObject::tr("修改用户资料"));
    //设置主布局框的最小尺寸
    splitterMain->setMinimumSize(splitterMain->minimumSize());
    //设置主布局框的最大尺寸
    splitterMain->setMaximumSize(splitterMain->maximumSize());

    //显示主布局框
    splitterMain->show();

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

    return a.exec();
}

发布了106 篇原创文章 · 获赞 32 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_37596943/article/details/104586684
Qt5
今日推荐