美文网首页
简单的学生管理系统(Qt)

简单的学生管理系统(Qt)

作者: 明白已晚 | 来源:发表于2017-04-22 22:40 被阅读1362次

1.主要功能,增 删 改 查
2.数据以文件形式处理

菜单.png 删除学生.png 更改学生信息.png 查询信息.png

在写的过程遇到的问题

1.多按钮的如何获取按钮上的信息

性别这种单选的和兴趣这种多选的(radio button是我选的性别的按钮)如何获取控件上的信息?
首先性别和兴趣我分别合成两个组,sex_buttons和inter_buttons

其次是对性别组来说

QString sex=ui->sex_buttons->checkedButton()->text();

对于兴趣组来说,因为是多选所以要想设置一些属性,让其组件中的checkeBox不是独享的,方法可以是在ui中将inter_buttons属性中exclusive后的对号去掉,或者可以直接在文本中设置

ui->inter_buttons()->setExclusive(false);

兴趣由于是多个需要用QList<QAbstratButton*>inter的链来存放,各个兴趣之间用空格隔开

QList<QAbstactButton*>inter->ui->inter_buttons->buttons();
QString temp="";
for(int i=0;i<inter.size();i++)
{
    if(inter[i]->checked())
       {
              temp.append(' ');
              temp.append(inter[i]->text());
              inter[i]->setChecked(false);
         }
}

2.如何将信息保存在文件中

首先建立一个文件

QFile file("student.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))
     return;

其次将数据写入文件

QTextStream Out(&file);//文件写入流,括号中为写入文件的地址
Out<<name<<" "<<sex<<" "<<temp<<endl;//很方便的文件写入

3.static void fileread(QList<QString>stu_lines)

这个是自写函数,将文本里的内容读到容器链表中

   QFile file("student.txt");
    if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
    {
        return;
    }
    while(!file.atEnd())
    {
       stu_lines.append(file.readLine());
    }
static 在类中可以不用对象直接调用,在其他类中通过类名加上::调用很方便的
读取每行是file.readLine()
删除某行在容器中是stu_lines.removeAt(m_int)

4.如何将读到的内容显示在UI界面上

   QString line=stu_lines[index];
    QStringList subs=line.split(' ');//将字符串分成一个字符串链
    ui->lineEdit_name->setText(subs[0]);
    ui->lineEdit_id->setText(subs[1]);
    QList <QAbstractButton*>se=ui->sex_buttons->buttons();
    for(int i=0;i<se.size();i++)
    {
        if(se[i]->text()==subs[2])
        {
            se[i]->setChecked(true);
        }
    }
    int ageint=ui->comboBox->findText(subs[3]);//返回与字符串相等的位置
    ui->comboBox->setCurrentIndex(ageint);//设置属性
    int subjectint=ui->comboBox_2->findText(subs[4]);
    ui->comboBox_2->setCurrentIndex(subjectint);
    QList<QAbstractButton*>inter=ui->interset_buttons->buttons();
    for(int i=0;i<inter.size();i++)//将所有按钮设置为空,方便下次使用
    {
       inter[i]->setChecked(false);
    }
    for(int i=5;i<subs.size();i++)//多兴趣的设置
    {
        QString temp=subs[i].trimmed();//去除两端的空白,包括\n\t(这步骤很重要)
        for(int j=0;j<inter.size();j++)
        {
         if(inter[j]->text()==temp)
         {
             inter[j]->setChecked(true);
             break;
          }
        }
    }

5.重写closeEvent函数(目的是在每次关闭的时候都会进行保存数据的操作)

在xx.h文件中
protected:
                 virtual void closeEvent (QCloseEvent *event));
   在xx.cpp中
 void closeEvent (QCloseEvent *event))
 {
     if(QMessageBox::Cancel==QMessageBox::warning(NULL,"Close me","Are you sure",\
                                                 QMessageBox::Ok|QMessageBox::Cancel))
    {
        event->ignore();
        return;
    }
    QFile file("student.txt");
    if(!file.open(QIODevice::WriteOnly|QIODevice::Text))
    {
        return;
    }
    QTextStream out(&file);
    for(int i=0;i<stu_lines.size();i++)
    {
        out<<stu_lines[i].trimmed()<<endl;
    }
    file.close();

 }

6.数据的查询及表格的制作

QStandardItemModel * mytable;//用来保存数据的组织形式,每一项都是一个QStandardItem

先绘制表格

     mytable=new QStandardItemModel;//new 一个对象,然后制作标题栏
     mytable->setHorizontalHeaderItem(0,new QStandardItem(QObject::tr("Name")));
     mytable->setHorizontalHeaderItem(1,new QStandardItem(QObject::tr("Id")));
     mytable->setHorizontalHeaderItem(2,new QStandardItem(QObject::tr("Sex")) );
     mytable->setHorizontalHeaderItem(3,new QStandardItem(QObject::tr("Age")));
     mytable->setHorizontalHeaderItem(4,new QStandardItem(QObject::tr("Subject")));
     mytable->setHorizontalHeaderItem(5,new QStandardItem(QObject::tr("Interest")));
     ui->tableView->setModel(mytable);//将数据模型与QtableView联系在一起
     ui->tableView->setColumnWidth(0,50);
     ui->tableView->setColumnWidth(1,50);
     ui->tableView->setColumnWidth(2,50);
     ui->tableView->setColumnWidth(3,50);
     ui->tableView->setColumnWidth(4,100);
     ui->tableView->setColumnWidth(5,200);

添加数据

void Serch_student::doquery(int num,QString line_name)
 { int k=0;//第一行
     for(int i=0;i<stu_lines.size();i++)
  {
        QString line=stu_lines[i];
        QStringList subs=line.split(' ');//这两步合在一块,不然会有错误
        if(num==0)
        {
            if(line_name!=subs[0])//第一个字符窜与line_edit的内容不一样,继续。num表示第几个属性参传过来
                continue;
        }
        if(num==1)
        {
            if(line_name!=subs[1])
                continue;
        }
        if(num==2)
        {
            if(line_name!=subs[2])
                continue;
        }
        if(num==3)
        {
            if(line_name!=subs[3])
                continue;
        }
        if(num==4)
        {
            if(line_name!=subs[4])
                continue;
        }
        for(int j=0;j<5;j++)
        {
            mytable->setItem(k,j,new QStandardItem(subs[j]));
        }
         QString temp="";
        for(int m=5;m<subs.size();m++)
        {
           temp+=subs[m];
           temp.append("_");
        }
        mytable->setItem(k++,5,new QStandardItem(temp));
   }
}

记得加头文件哦
QT QTableView用法小结
源码下载

相关文章

网友评论

      本文标题:简单的学生管理系统(Qt)

      本文链接:https://www.haomeiwen.com/subject/qlfjzttx.html