QT 学生通讯录

一、项目目标

本次项目的主要内容是设计开发一个学生通讯录软件,采用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();
}

四、源代码下载

下载链接

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值