Qt5——布局管理

简介: Qt5——布局管理

文章目录

分割窗口QSplitter类

示例

停靠窗口QDockWidget类

示例

堆栈窗体QStackedWidget类

示例

基本布局(QLayout)

示例

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

实现步骤

导航页实现

“基本信息”页面实现

“联系方式”页面实现

“详细资料”页面实现

主函数实现


本文参考电子工业出版社出版的《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();
}


  • 执行结果如下:20200301085729933.png

20200301085753803.png

停靠窗口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()
{
}


  • 执行结果:

20200301092925790.png20200301093019154.png

20200301093019154.png

堆栈窗体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()
{
}


  • 执行结果

20200301102321861.png

20200301102345788.png

基本布局(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()
{
}
  • 执行结果

20200301112456343.png

20200301111617694.png

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

实现一个综合示例“修改用户资料”的项目,效果如下:

20200301173253233.png20200301173303392.png

20200301173312593.png

可以看到,在主界面上最左侧有一个文本选择框,根据选择不同切换不同界面,一共具有三个主要界面:详细信息界面、联系方式界面、详细资料界面。


实现步骤

导航页实现

  • 新建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();
}


相关文章
|
17天前
Qt 布局管理之 堆栈窗体
Qt 布局管理之 堆栈窗体
29 5
|
17天前
Qt 布局管理之 停靠窗口QDockWidget
Qt 布局管理之 停靠窗口QDockWidget
84 0
|
17天前
Qt 布局管理之分割窗口
Qt 布局管理之分割窗口
42 0
|
7月前
20 QT - 布局管理器概述
20 QT - 布局管理器概述
31 0
|
17天前
|
开发者
Qt 布局(QSplitter 类&QDockWidget 类) 总结
Qt 布局(QSplitter 类&QDockWidget 类) 总结
Qt 布局(QSplitter 类&QDockWidget 类) 总结
|
17天前
|
编译器 C语言 开发者
Qt Quick 常见控件与子控件布局规则
Qt Quick 常见控件与子控件布局规则
53 1
|
17天前
|
编解码 开发者 UED
Qt布局实战:实现高效、美观的GUI应用程序
Qt布局实战:实现高效、美观的GUI应用程序
260 2
|
17天前
使用代码实现QT自定义布局
使用代码实现QT自定义布局
|
8月前
|
容器
『PyQt5-Qt Designer篇』| 08 Qt Designer中容器布局和绝对布局的使用
『PyQt5-Qt Designer篇』| 08 Qt Designer中容器布局和绝对布局的使用
35 0

推荐镜像

更多