目录
一、设计需求
二、实现代码
三、代码解析
四、总结
一、设计需求
设计一个修改用户资料功能的对话框,要求包含基本信息、联系方式、详细资料的编辑和修改。本实例只实现界面。
二、实现代码
导航页面:
//添加的头文件
#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。下面具体阐述一下两者的联系与区别。
QFrame | QWidget | |
---|---|---|
继承关系 | 继承自QWidget | 直接继承自QObject,是所有可视化部件的基类 |
功能 | 带有边框和背景的可视化部件 | 可视化部件,没有特定的样式或外观 |
外观 | 可设置边框样式、背景色等 | 不具有具体外观,需要在派生类中实现 |
默认样式 | 有默认的边框样式 | 无默认样式 |
容器能力 | 可以作为容器类部件容纳其他子部件 | 可以作为容器类部件容纳其他子部件 |
上级类/祖先类 | QWidget -> QObject | QObject |
特殊用途 | 擅长创建带有边框的部件 | 提供基础的可视化功能 |
四、总结
QDialog是Qt框架中的一个类,用于创建对话框窗口(Dialog)。对话框通常用于与用户进行简单的交互,例如显示消息、提示用户输入或选择选项等。
QDialog是QWidget的子类,因此它继承了QWidget的一些基本功能。同时,QDialog还提供了一些特定于对话框的功能和属性,以便更好地满足对话框的需求。
QDialog类具有以下特点和功能:
模态或非模态:QDialog可以使用setModal(true)设置为模态对话框,即在对话框关闭之前阻止对父窗口的操作。默认情况下,对话框是非模态的。
按钮:QDialog通常包括一个或多个按钮用于确认、取消或执行其他操作。可以使用addButton()方法添加按钮,并可以设置预定义的标准按钮(如Ok、Cancel、Yes、No等)。
结果返回:QDialog可以通过执行exec()方法来显示对话框,并在关闭对话框时返回一个结果码用于判断用户的选择。
布局管理:可以使用布局管理器(如QVBoxLayout)来管理对话框中的控件和部件的位置和大小。
标题和图标:可以为对话框设置标题和图标。
大小调整:可以设置对话框的大小调整方式,例如固定大小、自动拉伸等。
QDialog为开发者提供了一种方便的方式来创建和管理对话框窗口,并与用户进行交互。可以根据需求,自定义对话框的外观和行为,以实现特定的交互效果。