基于QT实现的通讯录

前言

上大学以来第一次写博客,由于不知道写什么内容便把我的C++课设搬了上来,总体水平真的很低,就当写着玩吧(其实联系人可以用数据库储存,但我比较懒。。。)
后续计划:
1应该会把另外一些我感兴趣的课设也写成博客发出来。
2会去刷leetcode中的题,并把其中我觉得比较好的题目整理成博客发出来

一、题目要求

通讯录管理程序的设计
①利用MFC的向导,创建基于对话框的应用程序,设计操作界面;
②设计通讯录的数据结构(如:以数组或者动态链表)和相应的类;
③完成对通讯录中记录的增加、修改、删除和显示。
④能够按照姓名或电话号码等关键字进行查询。
⑤能够将通讯录信息用文件保存。

二、概要设计

主界面设计
主界面

导入信息
主界面
点击添加按钮
点击保存按钮
双击联系人姓名
输入并点击查询按钮
修改信息并点击保存按钮
点击删除按钮

三、详细设计

1、数据结构

1)联系人类

class person
{
public:
    person();
    person(QString nam,QString tele,QString address);
    QString getname();
    QString gettel();
    QString getadd();
    void setname(QString nam);
    void settel(QString tele);
    void setadd(QString addr);
private:
    QString name;//名字
    QString tel;//电话
    QString add;//住址
};

2)通讯录类

class personTable
{
public:
    personTable();
    ~personTable();
    void Add(person p);
    void Delete(int j);
    person*table;
    int getmax();
private:
    int maxsize;//最大联系人数量
    int current;//当前联系人
};

2、功能模块

1)导入数据

从input.txt中导入联系人数据

 QFile file("F:/C++_QT_191184_20181001444/input.txt");
     if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
     {
         QMessageBox::warning(this,tr("Error"),
                              tr("读取文件出错:%1").arg(file.errorString()));
         return;
     }
     QTextStream in(&file);
    while(!in.atEnd())
    {
        QString line=in.readLine();
        QStringList a=line.split(" ");
        QString name=a.at(0);
        QString telephone=a.at(1);
        QString address=a.at(2);
         addperson(name,telephone,address);
    }
file.close();

2)点击添加按钮

(1)对话框设计
在这里插入图片描述

(2)添加联系人

void Widget::addperson(QString name,QString tel,QString add)
{
         person p(name,tel,add);
         Table1.Add(p);
         QListWidgetItem *item=new QListWidgetItem(p.getname());
         ui->listWidget->addItem(item);
}

3)点击保存按钮

 void Widget::savetofile()
{
    QFile file2("F:/C++_QT_191184_20181001444/output.txt");
     if (!file2.open(QIODevice::WriteOnly | QIODevice::Text))
     {
         QMessageBox::warning(this,tr("Error"),
                              tr("读取文件出错:%1").arg(file2.errorString()));
         return;
     }
     QTextStream out(&file2);
     for(int i=0;i<Table1.getmax();i++)
     {
         out<<Table1.table[i].getname()+" "<<Table1.table[i].gettel()+" "+Table1.table[i].getadd()+"\n";
     }
     QMessageBox::information(this,"提示","已成功将通讯录信息导出到output.txt文件中!");
     file2.close();
}

4)双击联系人姓名

(1)对话框设计

在这里插入图片描述

(2)显示
void Widget::changedia()
{
    QListWidgetItem *item=ui->listWidget->currentItem();
    QString name=item->text();
    person p;
    for(int i=0;i<Table1.getmax();i++)
    {
        if( name.indexOf(Table1.table[i].getname())>=0)
        {
            p=Table1.table[i];
        }
    }
    changedialog*a=new changedialog(this,p.getname(),p.gettel(),p.getadd());
    a->setAttribute(Qt::WA_DeleteOnClose);
    a->show();
}

(3)修改信息并点击保存按钮
void Widget::Change(QString Name,QString tel,QString addr)
{
    person p;
    p.setname(Name);
    p.settel(tel);
    p.setadd(addr);
     QListWidgetItem *item=ui->listWidget->currentItem();
     QString name=item->text();
    for(int i=0;i<Table1.getmax();i++)
    {
        if(Table1.table[i].getname()==name)
        {
            Table1.table[i]=p;
        }
    }
    ui->listWidget->removeItemWidget(item);
    item->setText(Name);
}
(4)点击删除按钮
void Widget::Delete()
{
     QListWidgetItem *item=ui->listWidget->currentItem();
     QString name=item->text();
     int j;
     for(int i=0;i<Table1.getmax();i++)
     {
         if(Table1.table[i].getname()==name)
         {
             j=i;
         }
     }
     Table1.Delete(j);
     ui->listWidget->removeItemWidget(item);
     delete item;
}

5)查询

void Widget::search(QString s)//综合查询函数,自动判别用户输入的是姓名还是电话还是地址,并进行查询
{
    int j=0;
    bool tag=false;
     while(j<Table1.getmax())//按名字查询
     {
          QListWidgetItem* item = ui->listWidget->takeItem(0);
          QString a=item->text();
         if(a.indexOf(s)>=0)//如果包含用户输入的字符串,则代表找到了
         {
              ui->listWidget->addItem(item);
              tag=true;
         }
         else
         {

         }
         j++;
     }
     if(tag)return;//如果找到了,不再继续查询

     for(int i=0;i<Table1.getmax();i++)
     {
         QListWidgetItem *item=new QListWidgetItem(Table1.table[i].getname());
          ui->listWidget->addItem(item);
     }
     j=0;
     while(j<Table1.getmax())//按电话号码查询
     {
          QListWidgetItem* item = ui->listWidget->takeItem(0);
          QString name=item->text();
          person p;
          for(int i=0;i<Table1.getmax();i++)
          {
              if(Table1.table[i].getname()==name)
              {
                   p=Table1.table[i];
              }
          }
          QString a=p.gettel();
         if(a.indexOf(s)>=0)//如果包含用户输入的字符串,则代表找到了
         {
             item->setText(p.getname()+"("+p.gettel()+")");
              ui->listWidget->addItem(item);
              tag=true;
         }
         else
         {

         }
         j++;
     }
      if(tag)return;//如果找到了,不再继续查询

     for(int i=0;i<Table1.getmax();i++)
     {
         QListWidgetItem *item=new QListWidgetItem(Table1.table[i].getname());
          ui->listWidget->addItem(item);
     }
     j=0;
     while(j<Table1.getmax())//按住址查询
     {
          QListWidgetItem* item = ui->listWidget->takeItem(0);
          QString name=item->text();
          person p;
          for(int i=0;i<Table1.getmax();i++)
          {
              if(Table1.table[i].getname()==name)
              {
                   p=Table1.table[i];
              }
          }
          QString a=p.getadd();
         if(a.indexOf(s)>=0)//如果包含用户输入的字符串,则代表找到了
         {
             item->setText(p.getname()+"("+p.getadd()+")");
              ui->listWidget->addItem(item);
              tag=true;
         }
         else
         {

         }
         j++;
     }
      if(tag)return;//如果找到了,不再继续查询
}

四、运行结果

主界面

添加界面

若电话号码格式不对则出现提醒

输入正确电话号码并点击保存完成添加

双击联系人弹出显示及修改对话框

修改信息并点击保存即可完成修改

在这里插入图片描述

点击删除按钮删除该联系人

在这里插入图片描述

输入姓名查询联系人(可查询所有包含该字符串的联系人)

在这里插入图片描述

输入电话查询联系人(可查询所有包含该字符串的联系人)

在这里插入图片描述

点击保存按钮

在这里插入图片描述
查看文件

在这里插入图片描述

最后附上我的完整代码
link.

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值