Qt: 学生信息管理里系统,QTreewidget、QTableView实现

2023-10-08 17:58

本文主要是介绍Qt: 学生信息管理里系统,QTreewidget、QTableView实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

//源码下载地址: http://download.csdn.net/detail/rl529014/9666234                                         

C++、Qt学习交流群: 302558294(欢迎你的加入)

需求:

做一个简单的产品信息管理界面,能够新增,修改,删除产品信息;(所有数据均保存在内存中)

a.学生信息包括(姓名,学校(金牛小学,青羊小学),班级(1班,2班,3班),年龄,性别,身高,政治面貌,个人描述(不超过300字符)

b.界面左边采用QTreeWidget或相关控件显示学校、班级两级信息;

c.界面右边使用QListWidget或相关控件显示选中班级所有成员信息;

d.新增,修改,删除功能均使用菜单来完成;


程序界面展示:

(很多功能还不完善,本例仅供参考,欢迎大家补充)



所用技术:

1、实现自定义委托。

2、QTreewidget、QTableView,

3、MVC模式。

4、菜单栏的功能都可以在对应的控件上右击,弹出快捷菜单。

5、界面布局。


代码:

//main.cpp

<span style="font-size:14px;">#include <QApplication>
#include "widget.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);StuInfoManagementSystem w;w.show();return a.exec();
}
</span>


//widget.h

<span style="font-size:14px;">#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QStandardItemModel>
#include <QTableView>
#include <QMenu>
#include <QAction>
#include <QMenuBar>
#include <QTreeView>
#include <QTreeWidget>
#include <QStandardItem>
#include "controldelegate.h"class SpinboxDelegate;
class ComboboxDelegate;//namespace Ui {
//class StuInfoManagementSystem;
//}class StuInfoManagementSystem: public QWidget
{Q_OBJECTpublic:explicit StuInfoManagementSystem(QWidget *parent = 0);~StuInfoManagementSystem();public:void contextMenuEvent(QContextMenuEvent *e);void menuBarInit(); //菜单初始化void tableWidgetInit(); //table控件初始化void treeWidgetInit();void closeEvent(QCloseEvent *event);//程序关闭时触发void upDateTableView();private:QMenu *OperationMenu;  //操作菜单QAction *DeleteAction;QAction *InsertAction;QMenu *helpMenu; //帮助菜单QAction *aboutAction;QAction *aboutQtAction;QMenu *schoolAndGradeMenu;QAction *addSchoolAction;QAction *addGradeAction;QAction *delSchoolOrGradeAction;QMenuBar* menuBar;SpinboxDelegate* ageSpinbox;//年龄SpinboxDelegate* heightSpinbox; //身高ComboboxDelegate* schoolCombobox;//学校ComboboxDelegate* gradeCombobox;//班级ComboboxDelegate* sexCombobox; //性别ComboboxDelegate* statusCombobox; //政治面貌private slots:void sltInsertAction();void sltDeleteAction();void sltAddSchoolAction();void sltAddGradeAction();void sltDelSchoolOrGradeAction();void sltAboutAction();void SlotItemClicked(QTreeWidgetItem *item, int column);private:QStandardItemModel* tableModel;QTableView* table;QStandardItem *dataSources;QTreeWidget *treeWidget;//private:
//    Ui::StuInfoManagementSystem *ui;
};#endif // WIDGET_H
</span>

//widget.cpp

<span style="font-size:14px;">#include <QSplitter>
#include <QFileSystemModel>
#include <QTreeView>
#include <QListView>
#include <QVBoxLayout>
#include <QAbstractItemModel>
#include <QTableView>
#include <QMenuBar>
#include <QVBoxLayout>
#include <QDebug>
#include <QTreeWidgetItem>
#include <controldelegate.h>
#include <QToolTip>
#include <QAbstractItemView>
#include <QStandardItem>
#include <QList>
#include <QStandardItem>
#include <QMessageBox>
#include <QInputDialog>
#include "widget.h"
#include "ui_widget.h"StuInfoManagementSystem::StuInfoManagementSystem(QWidget *parent) : QWidget(parent)/*,ui(new Ui::StuInfoManagementSystem)*/
{setMinimumSize(1200,400);menuBarInit();//菜单初始化tableWidgetInit(); //table初始化treeWidgetInit(); //tree初始化QGridLayout *grid = new QGridLayout;grid->addWidget(menuBar,0,0,1,2);grid->addWidget(treeWidget,1,0);grid->addWidget(table,1,1);setLayout(grid);showMaximized();
}StuInfoManagementSystem::~StuInfoManagementSystem()
{//delete ui;
}void StuInfoManagementSystem::contextMenuEvent(QContextMenuEvent *e) //重写上下文事件
{//方法一if(table->hasFocus()){OperationMenu->move(cursor().pos());OperationMenu->show();}if(treeWidget->hasFocus()){schoolAndGradeMenu->move(cursor().pos());schoolAndGradeMenu->show();}//方法二//    {//        table->addAction(InsertAction);//        table->addAction(DeleteAction);//        table->setContextMenuPolicy(Qt::ActionsContextMenu);//    }
}void StuInfoManagementSystem::menuBarInit()
{menuBar = new QMenuBar(0);OperationMenu = new QMenu(QString::fromLocal8Bit("学生"));DeleteAction = new QAction(QString::fromLocal8Bit("删除"));InsertAction = new QAction(QString::fromLocal8Bit("插入"));OperationMenu->addAction(DeleteAction);OperationMenu->addAction(InsertAction);helpMenu = new QMenu(QString::fromLocal8Bit("帮助"));aboutAction = new QAction(QString::fromLocal8Bit("关于软件"));aboutQtAction = new QAction(QString::fromLocal8Bit("关于Qt"));helpMenu->addAction(aboutAction);helpMenu->addAction(aboutQtAction);schoolAndGradeMenu = new QMenu(QString::fromLocal8Bit("学校/班级"));addSchoolAction = new QAction(QString::fromLocal8Bit("添加 学校"));addGradeAction = new QAction(QString::fromLocal8Bit("添加 班级"));delSchoolOrGradeAction = new QAction(QString::fromLocal8Bit("删除"));schoolAndGradeMenu->addAction(addSchoolAction);schoolAndGradeMenu->addAction(addGradeAction);schoolAndGradeMenu->addAction(delSchoolOrGradeAction);menuBar->addMenu(schoolAndGradeMenu);menuBar->addMenu(OperationMenu);menuBar->addMenu(helpMenu);connect(InsertAction,SIGNAL(triggered(bool)),SLOT(sltInsertAction()));connect(DeleteAction,SIGNAL(triggered(bool)),SLOT(sltDeleteAction()));connect(addSchoolAction,SIGNAL(triggered(bool)),SLOT(sltAddSchoolAction()));connect(addGradeAction,SIGNAL(triggered(bool)),SLOT(sltAddGradeAction()));connect(delSchoolOrGradeAction,SIGNAL(triggered(bool)),SLOT(sltDelSchoolOrGradeAction()));connect(aboutAction,SIGNAL(triggered(bool)),SLOT(sltAboutAction()));connect(aboutQtAction,SIGNAL(triggered(bool)),qApp,SLOT(aboutQt()));}void StuInfoManagementSystem::tableWidgetInit()
{//tableview初始化{table  = new QTableView;tableModel = new QStandardItemModel;table->setModel(tableModel);tableModel->setHorizontalHeaderItem(0,new QStandardItem(QString::fromLocal8Bit("姓名")));tableModel->setHorizontalHeaderItem(1,new QStandardItem(QString::fromLocal8Bit("学校")));tableModel->setHorizontalHeaderItem(2,new QStandardItem(QString::fromLocal8Bit("班级")));tableModel->setHorizontalHeaderItem(3,new QStandardItem(QString::fromLocal8Bit("年龄")));tableModel->setHorizontalHeaderItem(4,new QStandardItem(QString::fromLocal8Bit("性别")));tableModel->setHorizontalHeaderItem(5,new QStandardItem(QString::fromLocal8Bit("身高")));tableModel->setHorizontalHeaderItem(6,new QStandardItem(QString::fromLocal8Bit("政治面貌")));tableModel->setHorizontalHeaderItem(7,new QStandardItem(QString::fromLocal8Bit("个人描述")));// 姓名,学校(金牛小学,青羊小学),班级(1班,2班,3班),年龄,性别,身高,政治面貌,个人描述(不超过300字符)table->setModel(tableModel);table->horizontalHeader()->setStretchLastSection(true);table->setItemDelegateForColumn(1, new ComboboxDelegate);table->setItemDelegateForColumn(2,new ComboboxDelegate);table->setItemDelegateForColumn(3,new SpinboxDelegate(3));table->setItemDelegateForColumn(4,new ComboboxDelegate);table->setItemDelegateForColumn(5,new SpinboxDelegate(5));table->setItemDelegateForColumn(6,new ComboboxDelegate);table->setEditTriggers(QAbstractItemView::DoubleClicked);table->setSelectionBehavior(QAbstractItemView::SelectRows);}
}void StuInfoManagementSystem::treeWidgetInit()
{treeWidget = new QTreeWidget;treeWidget->setMaximumWidth(200);treeWidget->setHeaderLabel(QString::fromLocal8Bit("学校/班级"));QTreeWidgetItem *qingYang = new  QTreeWidgetItem;qingYang->setText(0,QString::fromLocal8Bit("青羊小学"));QTreeWidgetItem  *jinNiu = new QTreeWidgetItem;jinNiu->setText(0,QString::fromLocal8Bit("金牛小学"));QStringList classlist;classlist << QString::fromLocal8Bit("1班") << QString::fromLocal8Bit("2班")<< QString::fromLocal8Bit("3班");for(int i=0;i<=2;i++){QTreeWidgetItem *tmp_qingYang = new  QTreeWidgetItem(qingYang);tmp_qingYang->setText(0,classlist.at(i));qingYang->addChild(tmp_qingYang);QTreeWidgetItem  *tmp_jinNiu = new QTreeWidgetItem(jinNiu);tmp_jinNiu->setText(0,classlist.at(i));jinNiu->addChild(tmp_jinNiu);}treeWidget->insertTopLevelItem(0,qingYang);treeWidget->insertTopLevelItem(1,jinNiu);connect(treeWidget,SIGNAL(itemPressed(QTreeWidgetItem *, int)),SLOT(SlotItemClicked(QTreeWidgetItem *, int)));
}void StuInfoManagementSystem::closeEvent(QCloseEvent *event)
{qDebug()<<"Application close";
}void StuInfoManagementSystem::sltInsertAction() //插入行操作
{QList<QStandardItem*> item;item.append(new QStandardItem(NULL));item.append(new QStandardItem(NULL));item.append(new QStandardItem(NULL));item.append(new QStandardItem(NULL));item.append(new QStandardItem(NULL));item.append(new QStandardItem(NULL));item.append(new QStandardItem(NULL));item.append(new QStandardItem(NULL));item.at(0)->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); //设置指定项的对齐方式item.at(7)->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);tableModel->insertRow(tableModel->rowCount(),item);
}void StuInfoManagementSystem::sltDeleteAction() //删除指定行操作
{int curreantRow = table->currentIndex().row(); //获取当前行数tableModel->removeRow(curreantRow);
}void StuInfoManagementSystem::sltAddSchoolAction()
{bool ok;QString text = QInputDialog::getText(this,"Please Input School Name",tr("School name:"),QLineEdit::Normal,tr(""),&ok);if(ok && !text.isEmpty()){QTreeWidgetItem *item = new QTreeWidgetItem;item->setText(0,text);int schoolCount = treeWidget->topLevelItemCount();treeWidget->insertTopLevelItem(schoolCount,item);}
}void StuInfoManagementSystem::sltAddGradeAction()
{if(treeWidget->currentItem()){bool ok;QString text = QInputDialog::getText(this,"Please Input Grade Name",tr("Grade name:"),QLineEdit::Normal,tr(""),&ok);if(ok && !text.isEmpty()){QTreeWidgetItem *item = new QTreeWidgetItem;item->setText(0,text);if(treeWidget->currentItem()->parent())//当前选中的是班级{for(int i = 0; i< treeWidget->currentItem()->parent()->childCount(); i++) //同一个学校的班级不能重复{if(treeWidget->currentItem()->parent()->child(i)->text(0) == text){QMessageBox::information(this, QString::fromLocal8Bit("警告"),QString::fromLocal8Bit("%1 已经存在").arg(text));return;}}treeWidget->currentItem()->parent()->addChild(item);}else{for(int i = 0; i< treeWidget->currentItem()->childCount(); i++) //同一个学校的班级不能重复{if(treeWidget->currentItem()->child(i)->text(0) == text){QMessageBox::information(this, QString::fromLocal8Bit("警告"),QString::fromLocal8Bit("%1 已经存在").arg(text));return;}}treeWidget->currentItem()->addChild(item);}}}treeWidget->expandAll();
}void StuInfoManagementSystem::sltDelSchoolOrGradeAction()
{QTreeWidgetItem *item = treeWidget->currentItem();if(!item->parent()){treeWidget->takeTopLevelItem(treeWidget->indexOfTopLevelItem(treeWidget->currentItem()));}else{QTreeWidgetItem *parent = item->parent();if(parent){parent->removeChild(item);}}
}void StuInfoManagementSystem::sltAboutAction()
{QMessageBox::about(this, tr("About Aoftware"),tr("Make By Hero"));
}void StuInfoManagementSystem::SlotItemClicked(QTreeWidgetItem *item, int column)
{//学校1,班级2 if(item->parent()) //当前item为子项{for(int row = 0; row <= tableModel->rowCount();row++){if(item->text(column) == tableModel->data(tableModel->index(row,2)).toString())  //班级{if(item->parent()->text(column) ==tableModel->data(tableModel->index(row,1)).toString()) //学校table->setRowHidden(row,false);elsetable->setRowHidden(row,true);}else{table->setRowHidden(row,true);}}}else //当前点击的item为父项{if(item->text(column) == QString::fromLocal8Bit("青羊小学")){for(int row = 0; row <= tableModel->rowCount();row++){if(tableModel->data(tableModel->index(row,1)).toString() != QString::fromLocal8Bit("青羊小学"))table->setRowHidden(row,true);elsetable->setRowHidden(row,false);}}else if(item->text(column) == QString::fromLocal8Bit("金牛小学")){for(int row = 0; row <= tableModel->rowCount();row++){if(tableModel->data(tableModel->index(row,1)).toString() != QString::fromLocal8Bit("金牛小学"))table->setRowHidden(row,true);elsetable->setRowHidden(row,false);}}}
}
</span>

//controldelegate

<span style="font-size:14px;">#ifndef CONTROLDELEGATE_H
#define CONTROLDELEGATE_H
#include <QItemDelegate>
#include <QObject>class SpinboxDelegate : public QItemDelegate  //年龄
{Q_OBJECTpublic:SpinboxDelegate(int column);QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;//void setEditorData(QWidget *editor, const QModelIndex &index) const ;void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const ;void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;//void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;private slots:void commitAndCloseEditor();private:int mColumn;
};class ComboboxDelegate : public QItemDelegate  //学校
{Q_OBJECTpublic:ComboboxDelegate();QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;private slots:void commitAndCloseEditor();
};#endif // CONTROLDELEGATE_H
</span>

//controldelegate.cpp

<span style="font-size:14px;">#include <QSpinBox>
#include <QComboBox>
#include <QDebug>
#include <QApplication>
#include <QStyleOptionViewItem>
#include <QDomDocument>
#include <QFile>
#include <QTextStream>
#include "controldelegate.h"
SpinboxDelegate::SpinboxDelegate(int column)
{mColumn = column;
}//为指定的列或者行创建部件
QWidget *SpinboxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,const QModelIndex &index) const
{if(index.column() ==3) //年龄{QSpinBox *editor = new QSpinBox(parent);editor->setRange(1,110);connect(editor,SIGNAL(editingFinished()),SLOT(commitAndCloseEditor()));return editor;}else if( index.column() == 5) //身高{QSpinBox *editor = new QSpinBox(parent);editor->setRange(120,220);connect(editor,SIGNAL(editingFinished()),SLOT(commitAndCloseEditor()));return editor;}else{return QItemDelegate::createEditor(parent,option,index);}
}//显示格式控制
void SpinboxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{if(index.column()== 5){int age = index.model()->data(index,Qt::DisplayRole).toInt();QString text = QString("%1 CM").arg(age,3,10,QChar(' '));QStyleOptionViewItem myOption = option;myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;drawDisplay(painter,myOption,myOption.rect,text);drawFocus(painter,myOption,myOption.rect);}else if(index.column() == 3){int height = index.model()->data(index,Qt::DisplayRole).toInt();QString text = QString("%1 Year").arg(height,3,10,QChar(' '));QStyleOptionViewItem myOption = option;myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;drawDisplay(painter,myOption,myOption.rect,text);drawFocus(painter,myOption,myOption.rect);}
}void SpinboxDelegate::commitAndCloseEditor()
{QSpinBox *editor = qobject_cast<QSpinBox*>(sender());emit commitData(editor);emit closeEditor(editor);
}//void SpinboxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
//{//}void SpinboxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{QSpinBox *spinBox = static_cast<QSpinBox*>(editor);spinBox->interpretText();int value = spinBox->value();model->setData(index, value, Qt::EditRole);
}ComboboxDelegate::ComboboxDelegate()
{}QWidget *ComboboxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{QComboBox *editor = new QComboBox(parent);if(index.column() == 1){editor->addItem(QString::fromLocal8Bit("青羊小学"));editor->addItem(QString::fromLocal8Bit("金牛小学"));editor->setCurrentIndex(0);connect(editor,SIGNAL(editingFinished()),SLOT(commitAndCloseEditor()));return editor;}else if(index.column() == 2){editor->addItem(QString::fromLocal8Bit("1班"));editor->addItem(QString::fromLocal8Bit("2班"));editor->addItem(QString::fromLocal8Bit("3班"));editor->setCurrentIndex(0);connect(editor,SIGNAL(editingFinished()),SLOT(commitAndCloseEditor()));return editor;}else if(index.column() == 4){editor->addItem(QString::fromLocal8Bit("男"));editor->addItem(QString::fromLocal8Bit("女"));editor->setCurrentIndex(0);connect(editor,SIGNAL(editingFinished()),SLOT(commitAndCloseEditor()));return editor;}else if(index.column() == 6){editor->addItem(QString::fromLocal8Bit("群众"));editor->addItem(QString::fromLocal8Bit("共青团员"));editor->addItem(QString::fromLocal8Bit("共产党员"));editor->setCurrentIndex(0);connect(editor,SIGNAL(editingFinished()),SLOT(commitAndCloseEditor()));return editor;}else{QItemDelegate::createEditor(parent,option,index);}
}void ComboboxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{if(index.column() == 1 || index.column() == 2 ||index.column() == 4 ||index.column() == 6){QString text = index.model()->data(index , Qt::DisplayRole).toString();QStyleOptionViewItem myOption = option;myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;drawDisplay(painter,myOption,myOption.rect,text);drawFocus(painter,myOption,myOption.rect);}else{QItemDelegate::paint(painter,option,index);}
}void ComboboxDelegate::commitAndCloseEditor()
{QComboBox *editor = qobject_cast<QComboBox*>(sender());emit commitData(editor);emit closeEditor(editor);
}
</span>

这篇关于Qt: 学生信息管理里系统,QTreewidget、QTableView实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/167018

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义