一、项目目标
本次项目的主要内容是设计开发一个学生通讯录软件,采用xml格式存储数据,具备学生信息添加、编辑、删除、全部删除、查找、专业分类等功能。
二、运行界面
主页面
搜索页面
三、源代码
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include"form_add.h"
#include"form_change.h"
#include"form_search.h"
#include<QTreeWidgetItem>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
Form_add *add;
Form_change *change;
Form_search *search;
QList<QStringList> SumList;
QTreeWidgetItem * root;
QTreeWidgetItem * current_item;
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
private slots:
void on_action_add_triggered();
void on_action_change_triggered();
void add_information();
void change_information();
void on_action_search_triggered();
void on_action_save_triggered();
void on_action_backups_triggered();
void on_action_del_triggered();
void on_action_delAll_triggered();
bool check_major(QStringList);
void select_major(QTreeWidgetItem*);
void Refresh();
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"form_add.h"
#include"form_change.h"
#include"form_search.h"
#include<QDebug>
#include<QStringList>
#include<QTableWidget>
#include<QTreeWidget>
#include<QTreeWidgetItem>
#include<QtXml>
#include<QDomDocument>
#include<QFile>
#include<QFileDialog>
#include<QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->treeWidget->setHeaderLabels(QStringList()<<"");
root = new QTreeWidgetItem(QStringList()<<"全部");
ui->treeWidget->addTopLevelItem(root);
ui->treeWidget->setCurrentItem(root);
current_item = root;
ui->action_add->setIcon(QIcon(":/res/add.jpg"));
ui->action_change->setIcon(QIcon(":/res/edit.png"));
ui->action_search->setIcon(QIcon(":/res/search.png"));
ui->action_del->setIcon(QIcon(":/res/delete.jpg"));
ui->action_delAll->setIcon(QIcon(":/res/delete.jpg"));
ui->action_save->setIcon(QIcon(":/res/restore.jpg"));
ui->action_backups->setIcon(QIcon(":/res/backup.jpg"));
ui->toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
add = new Form_add;
search = new Form_search;
change = new Form_change;
QStringList tab;
tab<<"学生编号"<<"学生姓名"<<"学生性别"<< "学生年龄"<<"出生日期"<<"手机号码"<<"家庭地址"<<"电子邮箱"<<"专 业";
ui->tableWidget->setColumnCount(9);
ui->tableWidget->setHorizontalHeaderLabels(tab);
connect(ui->treeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(select_major(QTreeWidgetItem*)));
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->horizontalLayout->setStretchFactor(ui->treeWidget,1);
ui->horizontalLayout->setStretchFactor(ui->tableWidget,5);
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_action_add_triggered() //弹出添加信息窗口
{
add->show();
connect(add,SIGNAL(Is_ok()),this,SLOT(add_information()));
}
void MainWindow::on_action_change_triggered() //弹出编辑信息窗口
{
int row = ui->tableWidget->currentRow();
if(row<0){
QMessageBox::critical(this,"错误","当前未选择!","确认");
return;
}
for(int i=0;i<9;i++)
change->list[i] = ui->tableWidget->item(row,i)->text();
change->read();
change->show();
connect(change,SIGNAL(Is_change()),this,SLOT(change_information()));
}
void MainWindow::add_information() //添加信息
{
QStringList li=add->list;
if(check_major(li)){
QTreeWidgetItem *child = new QTreeWidgetItem(QStringList()<<li[8]);
root->addChild(child);
}
SumList<<li;
Refresh();
}
void MainWindow::change_information() //编辑信息
{
int row;
QStringList li=change->list;
QStringList li2=change->list2;
if(check_major(li)){
QTreeWidgetItem *child = new QTreeWidgetItem(QStringList()<<li[8]);
root->addChild(child);
}
for(int i=0;i<SumList.length();i++){
if(SumList[i] == li2)
row = i;
}
SumList.insert(row,li);
SumList.removeAt(row+1);
Refresh();
}
void MainWindow::on_action_search_triggered() //弹出搜索窗口
{
search->List(SumList,SumList.length());
search->show();
}
void MainWindow::on_action_save_triggered() //将当前所有学生信息保存为xml文件
{
QFile file("./test.xml");
file.open(QFile::WriteOnly|QFile::Truncate);
QDomDocument doc;
QDomProcessingInstruction instruction;
instruction=doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
doc.appendChild(instruction);
QDomElement root=doc.createElement("学生通讯录");
doc.appendChild(root);
int row = SumList.length();
for(int i=0;i<row;i++){
QDomElement student = doc.createElement("学生");
student.setAttribute("学生编号",SumList[i][0]);
QDomElement name = doc.createElement("学生姓名");
QDomText text;
text = doc.createTextNode(SumList[i][1]);
name.appendChild(text);
QDomElement is_man = doc.createElement("学生性别");
text = doc.createTextNode(SumList[i][2]);
is_man.appendChild(text);
QDomElement age = doc.createElement("学生年龄");
text = doc.createTextNode(SumList[i][3]);
age.appendChild(text);
QDomElement birth = doc.createElement("出生日期");
text = doc.createTextNode(SumList[i][4]);
birth.appendChild(text);
QDomElement phone = doc.createElement("手机号码");
text = doc.createTextNode(SumList[i][5]);
phone.appendChild(text);
QDomElement location = doc.createElement("家庭住址");
text = doc.createTextNode(SumList[i][6]);
location.appendChild(text);
QDomElement email = doc.createElement("电子邮箱");
text = doc.createTextNode(SumList[i][7]);
email.appendChild(text);
QDomElement major = doc.createElement("专业");
text = doc.createTextNode(SumList[i][8]);
major.appendChild(text);
student.appendChild(name);
student.appendChild(is_man);
student.appendChild(age);
student.appendChild(birth);
student.appendChild(phone);
student.appendChild(location);
student.appendChild(email);
student.appendChild(major);
root.appendChild(student);
}
QTextStream out_stream(&file);
doc.save(out_stream,4);
file.close();
}
void MainWindow::on_action_backups_triggered() //从xml文件里读取学生信息
{
QFile file("./test.xml");
if(!file.open(QFile::ReadOnly))
return;
ui->tableWidget->setRowCount(0);
int sum = SumList.length();
while(sum--)
SumList.removeLast();
int count = root->childCount();
for(int i=0;i<count;i++){
QTreeWidgetItem *childItem = root->child(0);
root->removeChild(childItem);
}
QDomDocument doc;
doc.setContent(&file);
QDomElement root0=doc.documentElement();
QDomNode node=root0.firstChild();
while(!node.isNull())
{
QStringList List;
if(node.isElement())
{
QDomElement e=node.toElement();
List<<e.attribute("学生编号");
QDomNodeList list=e.childNodes();
for(int i=0;i<list.count();i++)
{
QDomNode n=list.at(i);
if(node.isElement())
List<<n.toElement().text();
}
}
node=node.nextSibling();
int row = ui->tableWidget->rowCount()+1;
ui->tableWidget->setRowCount(row);
if(check_major(List)){
QTreeWidgetItem *child = new QTreeWidgetItem(QStringList()<<List[8]);
root->addChild(child);
}
SumList<<List;
for(int i=0;i<List.length();i++){
ui->tableWidget->setItem(row-1,i,new QTableWidgetItem(List[i]));
}
}
file.close();
}
void MainWindow::on_action_del_triggered() //删除当前点击信息
{
int row = ui->tableWidget->currentRow();
if(row<0){
QMessageBox::critical(this,"错误","当前未选择!","确认");
return;
}
QStringList str;
for(int i=0;i<9;i++)
str<<ui->tableWidget->item(row,i)->text();
int count = SumList.length();
for(int i=0;i<count;i++){
if(SumList[i] == str){
SumList.removeAt(i);
break;
}
}
Refresh();
}
void MainWindow::on_action_delAll_triggered() //删除全部
{
ui->tableWidget->setRowCount(0);
int sum = SumList.length();
while(sum--)
SumList.removeLast();
int count = root->childCount();
for(int i=0;i<count;i++){
QTreeWidgetItem *childItem = root->child(0);
root->removeChild(childItem);
}
}
bool MainWindow::check_major(QStringList str) //检查专业是否已存在
{
if(SumList.length() == 0)
return true;
else{
for(int i=0;i<SumList.length();i++){
if(SumList[i][8]==str[8])
return false;
}
return true;
}
}
void MainWindow::select_major(QTreeWidgetItem* item)
{
current_item = item;
Refresh();
}
void MainWindow::Refresh() //按照专业刷新当前表格
{
int n = root->childCount();
bool is_empty = true;
for(int i=0;i<n;i++){
is_empty = true;
QTreeWidgetItem *item = root->child(i);
QString str = item->text(0);
for(int j=0;j<SumList.length();j++){
if(item->text(0) == SumList[j][8]){
is_empty = false;
break;
}
}
if(is_empty){
if(item->text(0) == current_item->text(0)){
current_item = root;
ui->treeWidget->setCurrentItem(root);
}
root->removeChild(item);
i--;
n--;
}
}
QString major = current_item->text(0);
if(major == "全部"){
ui->tableWidget->setRowCount(0);
for(int i=0;i<SumList.length();i++){
ui->tableWidget->setRowCount(SumList.length());
for(int j=0;j<9;j++){
ui->tableWidget->setItem(i,j,new QTableWidgetItem(SumList[i][j]));
}
}
}
else{
QList<int> result;
for(int i=0;i<SumList.length();i++){
if(major == SumList[i][8]){
result.append(i);
}
}
ui->tableWidget->setRowCount(0);
for(int i=0;i<result.length();i++){
int row = ui->tableWidget->rowCount()+1;
ui->tableWidget->setRowCount(row);
for(int j=0;j<9;j++){
ui->tableWidget->setItem(row-1,j,new QTableWidgetItem(SumList[result[i]][j]));
}
}
}
}
form_add.cpp
#include "form_add.h"
#include "ui_form_add.h"
#include<QMessageBox>
#include<QDebug>
Form_add::Form_add(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form_add)
{
ui->setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
list<<""<<""<<""<<""<<""<<""<<""<<""<<"";
}
Form_add::~Form_add()
{
delete ui;
}
void Form_add::on_toolButton_add_clicked()
{
list[0] = ui->lineEdit_number->text();
list[1] = ui->lineEdit_name->text();
if(ui->radioButton_man->isChecked())
list[2] = "男";
else if(ui->radioButton_woman->isChecked())
list[2] = "女";
list[3] = ui->lineEdit_age->text();
list[4] = ui->dateEdit->text();
list[5] = ui->lineEdit_phone->text();
list[6] = ui->lineEdit_location->text();
list[7] = ui->lineEdit_email->text();
list[8] = ui->lineEdit_major->text();
for(int i=0;i<9;i++){
if(list[i]==""||list[5].length()!=11||!list[3].contains(QRegExp("^\\d+$"))||!list[5].contains(QRegExp("^\\d+$"))){
QMessageBox::critical(this,"错误","信息填写不完整或填写错误,请重新检查!","确认");
return;
}
}
emit Is_ok();
close();
}
void Form_add::on_toolButton_close_clicked()
{
close();
}
form_change.cpp
#include "form_change.h"
#include "ui_form_change.h"
#include<QMessageBox>
#include<QDebug>
#include<QDateEdit>
#include<QDate>
Form_change::Form_change(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form_change)
{
ui->setupUi(this);
list<<""<<""<<""<<""<<""<<""<<""<<""<<"";
}
Form_change::~Form_change()
{
delete ui;
}
void Form_change::on_toolButton_change_clicked() //将改变后的信息存储起来
{
list[0]=ui->lineEdit_number->text();
list[1] = ui->lineEdit_name->text();
if(ui->radioButton_man->isChecked())
list[2] = "男";
else if(ui->radioButton_woman->isChecked())
list[2] = "女";
list[3] = ui->lineEdit_age->text();
list[4] = ui->dateEdit->text();
list[5] = ui->lineEdit_phone->text();
list[6] = ui->lineEdit_location->text();
list[7] = ui->lineEdit_email->text();
list[8] = ui->lineEdit_major->text();
for(int i=0;i<9;i++){
if(list[i]==""||list[5].length()!=11||!list[3].contains(QRegExp("^\\d+$"))||!list[5].contains(QRegExp("^\\d+$"))){
QMessageBox::critical(this,"错误","信息填写不完整或填写错误,请重新检查!","确认");
return;
}
}
emit Is_change();
close();
}
void Form_change::read() //读取信息并显示出来
{
ui->lineEdit_number->setText(list[0]);
ui->lineEdit_name->setText(list[1]);
if(list[2] == "男"){
ui->radioButton_man->setChecked(true);
}
else if(list[2] == "女"){
ui->radioButton_woman->setChecked(true);
}
ui->lineEdit_age->setText(list[3]);
QDate date = QDate::fromString(list[4],"yyyy/M/d");
ui->dateEdit->setDate(date);
ui->lineEdit_phone->setText(list[5]);
ui->lineEdit_location->setText(list[6]);
ui->lineEdit_email->setText(list[7]);
ui->lineEdit_major->setText(list[8]);
list2 = list;
}
void Form_change::on_toolButton_close_clicked()
{
close();
}
form_search.cpp
#include "form_search.h"
#include "ui_form_search.h"
#include<QMessageBox>
#include<QDebug>
Form_search::Form_search(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form_search)
{
ui->setupUi(this);
QStringList li;
li<<"学生编号"<<"学生姓名"<<"学生性别"<< "学生年龄"<<"出生日期"<<"手机号码"<<"家庭地址"<<"电子邮箱"<<"专 业";
ui->comboBox->addItems(li);
this->setWindowTitle("搜索");
}
Form_search::~Form_search()
{
delete ui;
}
void Form_search::List(QList<QStringList> li,int row)
{
list = li;
sum_row = row;
}
void Form_search::on_pushButton_search_clicked()
{
ui->tableWidget->setRowCount(0);
int count = ui->comboBox->currentIndex();
QList<int> result;
QString str = ui->lineEdit->text();
for(int i=0;i<sum_row;i++){
if(str == list[i][count]){
result.append(i);
}
}
if(result.isEmpty()){
QMessageBox::critical(this,"注意","未搜索到结果","确定");
}
else{
QStringList tab;
tab<<"学生编号"<<"学生姓名"<<"学生性别"<< "学生年龄"<<"出生日期"<<"手机号码"<<"家庭地址"<<"电子邮箱"<<"专 业";
ui->tableWidget->setColumnCount(9);
ui->tableWidget->setHorizontalHeaderLabels(tab);
for(int i=0;i<result.length();i++){
int row = ui->tableWidget->rowCount()+1;
ui->tableWidget->setRowCount(row);
for(int j=0;j<9;j++){
ui->tableWidget->setItem(row-1,j,new QTableWidgetItem(list[result[i]][j]));
}
}
}
}
void Form_search::on_pushButton_close_clicked()
{
close();
}