前言

emmmm,笔者的课程设计。

需求分析

(1)在页面上可以显示的手机通讯录的联系人,并且可以显示联系人的所有信息。
(2)联系人分为在手机上的联系人和在手机卡上的联系人。
(3)可以实现联系人信息的增删改查,并以菜单的方式来操作。
(4)可以将联系人从两个空间之间进行转换,并且具有查重的功能。
(5)联系人的信息在底层需要保存在两个不同的文档中。

基于android的通讯录设计代码 基于安卓的通讯录设计_qt

概要设计

该部分将大致分析实现需求需要哪些的技术实现,大概的一个流程怎么走,大概需要哪些模块,UI框架怎么设计,怎么运行,需要大概多少接口,后期怎么维护等问题,为下一步详细设计打下铺垫。

首先需要先构思一个UI框架,在进入主页面的时候应该可以直接看到联系人的信息,这样的设计方式也是最为直观的方式;而对于通讯录分为了两块空间,可以采用两个页面来显示不同空间的信息;其次,为了实现其他的功能,可以通过添加一些按键上去来实现,而搜索功能,就直接使用搜索框就可以了,这样来说,对于对于“添加联系人”,“编辑联系人”两个功能,都需要两个跳转页面。因此,初步需要构建三个UI文件。

对于联系人的数据,该数据是以文本文件进行保存的,因此要想把数据呈现在ui界面上,就要使用文件操作读取数据中的文件,为了更好的区分每一个人的信息,可以使用”,”进行分割,使用”\n”来分割不同的联系人之间的信息;再者,为了便于调试,可以用python中的faker库批量生成假数据,用于程序的调试,因此,简单的数据储存方式便构建出来了,如下图所示。

基于android的通讯录设计代码 基于安卓的通讯录设计_控件_02

下图为用python的faker库生成假代码

基于android的通讯录设计代码 基于安卓的通讯录设计_控件_03

详细设计

首先需要先设计好各个页面的UI,仅仅具有视图的功能而没有实现功能。第一步先要设计主页面,在在页面上面显示联系人有两种基本方案:方案一:可以采用Qt中的QTableWidget控件进行构建,将联系人的信息放入一个QTableWidget中,对于手机和电话卡两个分区,可以将其分为两个QTableWidget控件进行构建,使用QStackWidget控件来在页面上选择查看手机联系人还是选择查看电话卡联系人;方案二:首先还是采用QStackWidget控件来将手机联系人和电话卡联系人分为两个部分来查看,对于每一个部分单独进行信息控制。最终本人选择了使用方案一进行开发,原因是这种方式开发更加合理,下图为根据方案一设计出来的UI主页面框架。

在QTableWidget控件中会读取所有的联系人信息,显示在上面,如果点击了添加联系人的按钮,就会跳转到另外一个界面,用户把新的联系人的数据输入,通过确认键来完成联系人的创建,并在主页面的QTableWidget控件上显示出来。

基于android的通讯录设计代码 基于安卓的通讯录设计_c++_04


基于android的通讯录设计代码 基于安卓的通讯录设计_搜索_05


在QTableWidget中选中了一个联系人,再点击删除联系人按钮,就会询问用户是否删除联系人,如果点击确认则在通过文件读写的方法删除掉联系人,最后刷新QTableWidget控件,在QTableWidget控件上就没有了这一位已经被删除的联系人了。

在QTableWidget中选中了一个联系人,再点击编辑联系人按钮,就会跳出一个新的页面来给用户修改联系人的信息,通过点击确认来完成修改。

基于android的通讯录设计代码 基于安卓的通讯录设计_c++_06


然后需要把信息显示在主页面上,我使用了flushPage函数进行刷新,如下图。

基于android的通讯录设计代码 基于安卓的通讯录设计_基于android的通讯录设计代码_07


其次,我使用了PersonController控制器来操作底层文件,上层函数通过控制底层函数从而达到读写文件数据的目的,该类的所有函数都采用静态类的方式,可以直接采用类名调用。

基于android的通讯录设计代码 基于安卓的通讯录设计_qt_08


然后实现添加联系人功能,让该按键与addPerson函数进行绑定,在addPerson中完成该功能,在addPerson函数中,需要先跳转到addWidget窗口,即调用addWidget =new AddWidget(ui->stackedWidget->currentIndex());,addWidget->show();来跳转,跳转到addWidget页面之后,只用addWidget中addPerson()函数进行操作,先将用户输入的所有信息放入一个集合中,然后再写入文本中,最后,关闭页面,然后刷新tableWidget控件刷新联系人。接着实现删除联系人功能,首先是按键绑定,绑定了之后,调用deletePerson函数,询问你是否确认删除选中的联系人,如果确认删除,则通过文件操作来将该联系人删除,重新写入没有该联系人的文本文件。简单来说,该函数用于删除联系人, 在删除之前,需要先启动删除联系人的触发机制删除联系人,如果没有选中某一项,请先选中某一项再进行操作,删除联系人的时候首先先检测在两个空间中有没有相同的人,如果存在相同的人名,则在两个空间都对其进行删除操作。

基于android的通讯录设计代码 基于安卓的通讯录设计_基于android的通讯录设计代码_09


然后需要实现编辑联系人的函数,首先是信号绑定,在绑定之后实现该函数的功能,该函数用于修改联系人,输入修改的信息后进行修改,如果在另外一个空间也存在该联系人(判定方式:两个联系人姓名和电话都相等)。按键按了之后实现页面跳转,跳转之后用户填写好需要修改的信息之后点击确认,就会将该联系人原来位置的信息进行修改,然后重新写入。

然后是联系人搜索功能,在输入框输入文字的时候就会进行搜索,搜索到人之后就会在QTableWidget空间上面显示出来。

基于android的通讯录设计代码 基于安卓的通讯录设计_c++_10


最后实现联系人转移的函数,点击了之后询问用户是否确认要转移,用户点击了确认之后开始进入判定程序,程序需要判断在另外一个储存空间是否存在相同的联系人,判断是否存在相同联系人且容量是否超过上限。

基于android的通讯录设计代码 基于安卓的通讯录设计_基于android的通讯录设计代码_11

最后具体的功能实现部分就不介绍了,然后UI设计的时候加点png上去就结束了,比较简单。

关键代码(节选)

void MainWindow::initAttr()
{

    ui->lineEdit_searchMan->setPlaceholderText("请输入姓名搜索联系人");
    ui->tableWidget_phone->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置不可编辑模式
    ui->tableWidget_sim->setEditTriggers(QAbstractItemView::NoEditTriggers);
    setWindowTitle("Mobile Phone Address Book Mangement System");
    //设置背景
    QPalette palette;
    QPixmap pixmap1("./images/bg1.jpg");
    palette.setBrush(QPalette::Background, QBrush(pixmap1));
    setPalette(palette);

    QPixmap pixmap2("./images/LitterDr.png");
    QIcon icon(pixmap2);
    setWindowIcon(icon);


    ui->tableWidget_PerCount->verticalHeader()->setVisible(false);
    ui->tableWidget_PerCount->horizontalHeader()->setVisible(false);
    ui->tableWidget_PerCount->setEditTriggers(QAbstractItemView::NoEditTriggers);//无编辑触发器

    //设置快捷键
    ui->btn_search->setShortcut(QString("ctrl+f"));

}


/*
 * @author  : Zeeland
 * @describe: 控件功能初始化,包括初始化信号与槽、导入文件
 * @param   : null
 * @return  : void
 */
void MainWindow::initFun()
{
    //刷新数据
    flushPage(1,0);


    //页面跳转
    connect(ui->btn_toSimPage,&QPushButton::clicked,this,&MainWindow::changeSimPage);
    connect(ui->btn_toPhonePage,&QPushButton::clicked,this,&MainWindow::changePhonePage);

    //搜索联系人
    connect(ui->lineEdit_searchMan,&QLineEdit::textChanged,this,&MainWindow::searchPerson);
    connect(ui->btn_search,&QPushButton::clicked,this,&MainWindow::searchPerson);

    //添加联系人
    connect(ui->btn_simAdd,&QPushButton::clicked,this,&MainWindow::addPerson);
    connect(ui->btn_phoneAdd,&QPushButton::clicked,this,&MainWindow::addPerson);

    //删除联系人
    connect(ui->btn_simDelete,&QPushButton::clicked,this,&MainWindow::deletePerson);
    connect(ui->btn_phoneDelete,&QPushButton::clicked,this,&MainWindow::deletePerson);

    //转移联系人
    connect(ui->btn_PToS,&QPushButton::clicked,this,&MainWindow::transferPerson);
    connect(ui->btn_SToP,&QPushButton::clicked,this,&MainWindow::transferPerson);

    //编辑联系人
    connect(ui->btn_simModify,&QPushButton::clicked,this,&MainWindow::modifyPerson);
    connect(ui->btn_phoneModify,&QPushButton::clicked,this,&MainWindow::modifyPerson);

}

void MainWindow::searchPerson()
{
    QString name = ui->lineEdit_searchMan->text();
    ui->tableWidget_sim->scrollToTop();
    ui->tableWidget_phone->scrollToTop();
    if(name!="")
    {
        QList<QList<QString>> list =PersonController::search(name);
        std::stringstream ss;
        ss<<list.size();
        ui->tableWidget_PerCount->clearContents();
        ui->tableWidget_PerCount->setItem(0,0,new QTableWidgetItem(QString(QString::fromStdString(ss.str()))));
        bool hasPerson = list.size();
        if (hasPerson)
        {
            clearPage(0,1);
            int row;
            QString displayString;
            for(int i=0;i<list.size();i++)
            {
                for(int col=0;col<7;col++)
                {
                    row = ui->tableWidget_sim->rowCount();
                    ui->tableWidget_sim->insertRow(row);
                    ui->tableWidget_sim->setItem( i,col,new QTableWidgetItem(list[i][col]));
                    ui->tableWidget_phone->insertRow(row);
                    ui->tableWidget_phone->setItem(i ,col,new QTableWidgetItem(list[i][col]));
                }
            }
        }
        else
        {
            ui->tableWidget_PerCount->clearContents();
            ui->tableWidget_PerCount->setItem(0,0,new QTableWidgetItem(QString(QString::fromStdString("0"))));
        }
    }
    else
    {
        flushPage(1,0);
    }
}

运行效果

上图

(1)主页面

基于android的通讯录设计代码 基于安卓的通讯录设计_基于android的通讯录设计代码_12


(2)点击电话卡联系人

基于android的通讯录设计代码 基于安卓的通讯录设计_基于android的通讯录设计代码_13

(3)添加联系人

基于android的通讯录设计代码 基于安卓的通讯录设计_qt_14


基于android的通讯录设计代码 基于安卓的通讯录设计_控件_15

基于android的通讯录设计代码 基于安卓的通讯录设计_控件_16


(4)删除联系人

基于android的通讯录设计代码 基于安卓的通讯录设计_控件_17


基于android的通讯录设计代码 基于安卓的通讯录设计_基于android的通讯录设计代码_18


(5)编辑联系人

基于android的通讯录设计代码 基于安卓的通讯录设计_qt_19


基于android的通讯录设计代码 基于安卓的通讯录设计_基于android的通讯录设计代码_20


基于android的通讯录设计代码 基于安卓的通讯录设计_基于android的通讯录设计代码_21


(6)转移联系人

基于android的通讯录设计代码 基于安卓的通讯录设计_c++_22


基于android的通讯录设计代码 基于安卓的通讯录设计_c++_23


(7)搜索联系人

基于android的通讯录设计代码 基于安卓的通讯录设计_搜索_24


基于android的通讯录设计代码 基于安卓的通讯录设计_搜索_25

总结

如果想要相关报告可以私聊我。

项目已开源:https://gitee.com/zeeland/Mobile-phone-address-book-relation-system 开发不易,求star!

基于android的通讯录设计代码 基于安卓的通讯录设计_基于android的通讯录设计代码_26


基于android的通讯录设计代码 基于安卓的通讯录设计_c++_27


基于android的通讯录设计代码 基于安卓的通讯录设计_控件_28