九、综合实例:修改用户资料(Qt5 GUI系列)


目录

一、设计需求

二、实现代码

三、代码解析

四、总结


一、设计需求

        设计一个修改用户资料功能的对话框,要求包含基本信息、联系方式、详细资料的编辑和修改。本实例只实现界面。

二、实现代码

导航页面:

//添加的头文件
#include <QStackedWidget>
#include <QPushButton>
#include "baseinfo.h"
#include "contact.h"
#include "detail.h"

class Content : public QFrame
{
    Q_OBJECT
public:
    Content(QWidget *parent=0);
    QStackedWidget *stack;
    QPushButton *AmendBtn;
    QPushButton *CloseBtn;

    BaseInfo  *baseInfo;
    Contact *contact;
    Detail *detail;
};

#include "content.h"

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

基本信息:

//添加的头文件
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QTextEdit>
#include <QGridLayout>
#include <QPushButton>

class BaseInfo : public QWidget
{
    Q_OBJECT
public:
    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;
};

#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("性别:"));
    //新建QComboBox对象,并添加两个条目
    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::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);
    LeftLayout->setColumnStretch(0,1);
    LeftLayout->setColumnStretch(1,3);
    /****右侧****/
    HeadLabel =new QLabel(tr("头像: "));                    //右上角部分
    HeadIconLabel =new QLabel;
    QPixmap icon("312.jpeg");
    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);
}

联系方式:

//添加的头文件
#include <QLabel>
#include <QGridLayout>
#include <QLineEdit>
#include <QCheckBox>
class Contact : public QWidget
{
    Q_OBJECT
public:
    Contact(QWidget *parent=0);
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;
};

#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(CodeLineEdit,2,1);
    mainLayout->addWidget(MoviTelLabel,3,0);
    mainLayout->addWidget(MoviTelLineEdit,3,1);
    mainLayout->addWidget(MoviTelCheckBook,3,2);
    mainLayout->addWidget(ProTelLabel,4,0);
    mainLayout->addWidget(ProTelLineEdit,4,1);
    mainLayout->setSizeConstraint(QLayout::SetFixedSize);
}

详细资料:

//添加的头文件
#include <QLabel>
#include <QComboBox>
#include <QLineEdit>
#include <QTextEdit>
#include <QGridLayout>
class Detail : public QWidget
{
    Q_OBJECT
public:
    Detail(QWidget *parent=0);
private:
    QLabel *NationalLabel;
    QComboBox *NationalComboBox;
    QLabel *ProvinceLabel;
    QComboBox *ProvinceComboBox;
    QLabel *CityLabel;
    QLineEdit *CityLineEdit;
    QLabel *IntroductLabel;
    QTextEdit *IntroductTextEdit;
    QGridLayout *mainLayout;
};

#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);
}

主函数:

#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);
    //用于设置QSplitter对象在调整大小时是否使用不透明的方式进行绘制
    splitterMain->setOpaqueResize(true);
    //在水平分割窗左侧窗口插入QListWidget类对象
    QListWidget *list =new QListWidget(splitterMain);
    list->insertItem(0,QObject::tr("基本信息"));
    list->insertItem(1,QObject::tr("联系方式"));
    list->insertItem(2,QObject::tr("详细资料"));

    //在水平分割窗右侧窗口插入Content类对象
    Content *content =new Content(splitterMain);
    //连接列表框的currentRowChanged()信号与堆栈窗的setCuirentIndex()槽函数
    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();
    
    return a.exec();
}

效果展示:


 

三、代码解析

        上述代码中,导航页面Content类继承QFrame而其他页面继承的是QWidget。下面具体阐述一下两者的联系与区别。

QFrameQWidget
继承关系继承自QWidget直接继承自QObject,是所有可视化部件的基类
功能带有边框和背景的可视化部件可视化部件,没有特定的样式或外观
外观可设置边框样式、背景色等不具有具体外观,需要在派生类中实现
默认样式有默认的边框样式无默认样式
容器能力可以作为容器类部件容纳其他子部件可以作为容器类部件容纳其他子部件
上级类/祖先类QWidget -> QObjectQObject
特殊用途擅长创建带有边框的部件提供基础的可视化功能

四、总结

        QDialog是Qt框架中的一个类,用于创建对话框窗口(Dialog)。对话框通常用于与用户进行简单的交互,例如显示消息、提示用户输入或选择选项等。
        QDialog是QWidget的子类,因此它继承了QWidget的一些基本功能。同时,QDialog还提供了一些特定于对话框的功能和属性,以便更好地满足对话框的需求。
        QDialog类具有以下特点和功能:
        模态或非模态:QDialog可以使用setModal(true)设置为模态对话框,即在对话框关闭之前阻止对父窗口的操作。默认情况下,对话框是非模态的。
        按钮:QDialog通常包括一个或多个按钮用于确认、取消或执行其他操作。可以使用addButton()方法添加按钮,并可以设置预定义的标准按钮(如Ok、Cancel、Yes、No等)。
        结果返回:QDialog可以通过执行exec()方法来显示对话框,并在关闭对话框时返回一个结果码用于判断用户的选择。
        布局管理:可以使用布局管理器(如QVBoxLayout)来管理对话框中的控件和部件的位置和大小。
        标题和图标:可以为对话框设置标题和图标。
        大小调整:可以设置对话框的大小调整方式,例如固定大小、自动拉伸等。

        QDialog为开发者提供了一种方便的方式来创建和管理对话框窗口,并与用户进行交互。可以根据需求,自定义对话框的外观和行为,以实现特定的交互效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值