Qt之学生信息管理系统(version:1.0)

Qt练习1:学生信息管理
说明:初学Qt,程序有很多不完善的地方,而且用的方法页是笨方法,刚完成,此为版本1,后续会添加其他功能。有问题的地方欢迎大家指正。
下面是本设计的界面图片,很简单,但涉及到了数据库,模型视图,布局等知识点,像我一样的新手可用来练手还可以的。
Qt之学生信息管理系统(version:1.0)_第1张图片

     操作:左边表格的某一行被选中,右边的QWigetList立即显示出所有信息;

    选择一行,点击删除按钮即可删除;

    QLineEdit对象中输入名字,点击查找,得到所需信息,同时点击返回列表按钮,就可返回到全表;

    点击添加按钮,可出一个添加对话框,如下:

Qt之学生信息管理系统(version:1.0)_第2张图片

1.用到的Qt知识点:

  (1)  数据库:QSqlite数据库的创建以及表的生成;

            QSqlDatabase:生成数据库连接

            QSqlError:用来返回最后的错误

           本设计用的驱动是QSqlite,Qt内嵌,没有写出用户名名等代码;

         等等.....

(2)  Qt的模型视图相关知识点

         QSqlTableModel类可作为数据源在Qt的视图类中表示,如QTableView,QListView等。

        QSqlTableModel::setTable(const QString &)用来添加数据表

        QTableView::setModel:创建一个新的selection模型,并通过QSqlTabModel->select()显示出来;

       QModelIndex:定位所选数据在数据模型中的位置。

      QModelIndexList:储存记录QTableView中被选择到的记录的数据

      等等......

2. 代码详细说明

(1)创建数据库

 
  
void DbConnect::creatDB()
{
    QSqlError err;
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("student");
    db.open();
    if(!db.open())
    {
        err = db.lastError();
        qDebug()< 
  
    }
    else
    ui->status_Label->setText(tr("创建sqlite数据库成功"));
 
  
    QSqlQuery query;
    bool success=query.exec("create table student (id int primary key,name varchar(40),age int,major varchar(40),credit int,address varchar(40))");
    if (success)
        qDebug()<<QObject::tr("数据库表创建成功");
    query.exec(QObject::tr("insert into student values(1,'李小龙', 32, '截拳道', 100 ,'中国')"));
    query.exec(QObject::tr("insert into student values(2,'李四', 60, '猴拳',  80, '北京')"));
    query.exec(QObject::tr("insert into student values(3,'张三', 31, '跆拳道', 90, '上海')"));
    query.exec(QObject::tr("insert into student values(4,'王五', 30, '截拳道', 88, '南京')"));
    query.exec(QObject::tr("insert into student values(5,'小明', 18, '截拳道',  92, '深圳')"));
 
  
}
 

其中

 
  
 <1>QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("student");
    db.open();

用来建立一个数据库连接,并在本地进程地址空间创建一个QSQLITE类型的数据库,;

 <2>bool success=query.exec("create table student....
    用来生成一个名为student的数据库表,表有6个字段,并且设置id为关键字;

<3>query.exec(QObject::tr("insert into student values(1,'李小龙', 32, '截拳道', 100 ,'中国')"));
   用来向数据库插入一条记录,插入记录还有其他方法可实现;

(2)主窗口的布局,创建两个QGroupBox类对象,并作主窗口布局

MainWindow::MainWindow(const QString &studentTable, QWidget *parent)
    : QMainWindow(parent)
{
  stuModel = new QSqlTableModel(this);
  stuModel->setTable(studentTable); //选择student表,studenttable是参数,程序运行时用实参"student"代替
  stuModel->select();               //显示数据表记录
 
  
  QGroupBox *student = createStuGroup();//上图中左边的box
  QGroupBox *detail = createDetailGroup();
 
  
  QGridLayout *layout = new QGridLayout;
  layout->addWidget(student, 0, 0, 2, 1 );
  layout->addWidget(detail, 0,1, 2, 1);
  layout->setColumnMinimumWidth(0, 500);
  QWidget *widget = new QWidget;
  widget->setLayout(layout);
  setCentralWidget(widget);
  resize(850,400);
}
 
  

左边Box的创建,显示数据库表的详细信息
QGroupBox* MainWindow::createStuGroup()
{
    stuView = new QTableView;//创建一个视图类
    stuView->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置表为不可编辑
    stuView->setSortingEnabled(true);   //开启排序
    stuView->setSelectionBehavior(QAbstractItemView::SelectRows);//选择习惯为鼠标点击选择一行
    stuView->setSelectionMode(QAbstractItemView::SingleSelection);//单击选择
    stuView->setShowGrid(false);
    stuView->setAlternatingRowColors(true);
    stuView->setModel(stuModel);
    connect(stuView,SIGNAL(clicked(QModelIndex)),this,SLOT(changeStuView(QModelIndex)));
 
   
    QGroupBox *box = new QGroupBox(tr("学生资料"));
    QGridLayout *layout = new QGridLayout;
    layout->addWidget(stuView,0,0);
    box->setLayout(layout);
    return box;
}
上图右边Boxde创建
QGroupBox* MainWindow::createDetailGroup()
{
    QGroupBox *box = new QGroupBox(tr("详细信息"));
    showList = new QListWidget;//用QListWidget类显示学生详细资料
    QPushButton *deleteBtn = new QPushButton(tr("删除"));
    QPushButton *addBtn = new QPushButton(tr("添加"));
    QPushButton *selectBtn = new QPushButton(tr("查找"));
    QPushButton *returnBtn = new QPushButton(tr("返回列表"));
    QPushButton *quitBtn = new QPushButton(tr("退出"));
    seLineEdit = new QLineEdit;
    QGridLayout *layout = new QGridLayout;
   

    layout->addWidget(showList,0,0,3,2);
    layout->addWidget(deleteBtn,3,0,1,1);
    layout->addWidget(addBtn,3,1,1,1);
    layout->addWidget(seLineEdit,4,0,1,1);
    layout->addWidget(selectBtn,4,1,1,1);
    layout->addWidget(returnBtn,5,0,1,1);
    layout->addWidget(quitBtn,5,1,1,1);
 
   
    box->setLayout(layout);
    return box;    
 
   
}

(3)将选中行的代码在右边的showList中显示出来
void MainWindow::changeStuView(QModelIndex index)
{   showList->clear();
    item = new QListWidgetItem(showList);//为showList创建数据条目
    QSqlRecord record = stuModel->record(index.row());//获得所选行的内容
    int stuId = record.value("id").toInt();
    QString name =record.value("name").toString();//分离出相关字段的值
    int age = record.value("age").toInt();
    QString major =record.value("major").toString();
    int credit = record.value("credit").toInt();
    QString add = record.value("address").toString();
//将值设置到item中
    item->setText(tr("编号:%1\n 姓名:%2\n 年龄:%3\n 专业:%4\n 学分:%5\n 地址:%6\n").arg(stuId).arg(name).arg(age).arg(major).arg(credit).arg(add));
}
 (4)获取要删除的信息 
  
void MainWindow::removeStuFromStuModel()
{
    QModelIndexList select =stuView->selectionModel()->selectedRows(0);//将获取到的信息储存在QModelIndexList中
    if(!select.empty())
    {
        QModelIndex idIndex = select.at(0);//得到所选行的id索引,会在删除时用到此id
        QString name =idIndex.sibling(idIndex.row(),1).data().toString();//得到所选行的学生姓名
        QMessageBox::StandardButton button;
        button=QMessageBox::question(this,tr("删除学生信息"),QString (tr("确定从数据库删除'%1'的信息吗?").arg(name)),QMessageBox::Yes|QMessageBox::No);
        if(button==QMessageBox::Yes)
        {
          stuModel->removeRow(idIndex.row());//从数据库删除记录,idIndex.row,返回idIndex所定位的行.
          stuModel->submitAll();
          stuModel->select();//重新选择数据
 
   
        }

(5)查询,在QLineEdit的对象seLineEdit中输入名字,即可得到对应的记录,       不足之处,未作安全检测
void MainWindow::selectSlot()
{
 
   
  QString name =seLineEdit->text();
  if(name.isEmpty())
      return;
  //qDebug()<
  else
  {
  stuModel->setFilter(QObject::tr("name = '%1'").arg(name));
  stuModel->select();//显示结果
  seLineEdit->clear();
  }
}
(6)添加数据到数据库
void MainWindow::addNewToTable()
{
    int id = idLineEdit->text().toInt();//获得要添加的信息
    QString name = nameLineEdit->text();
    int age =ageLineEdit->text().toInt();
    QString major = majorLineEdit->text();
    int credit = creditLineEdit->text().toInt();
    QString address = addLineEdit->text();
 
   
    //if(id.is||name.isEmpty()||age==0||major.isEmpty()||credit==0||address.isEmpty());
    //return;
    qDebug()< 
   
    QSqlRecord record;
    QSqlField f1("id",QVariant::Int);//设置添加记录的字段
    QSqlField f2("name",QVariant::String);
    QSqlField f3("age",QVariant::Int);
    QSqlField f4("major",QVariant::String);
    QSqlField f5("credit",QVariant::Int);
    QSqlField f6("address",QVariant::String);
 
   
    f1.setValue(QVariant(id));//给字段添加值
    f2.setValue(QVariant(name));
    f3.setValue(QVariant(age));
    f4.setValue(QVariant(major));
    f5.setValue(QVariant(credit));
    f6.setValue(QVariant(address));
 
   
    record.append(f1);//将字段保存到QSqlRecord中
    record.append(f2);
    record.append(f3);
    record.append(f4);
    record.append(f5);
    record.append(f6);
 
   
    stuModel->insertRecord(-1,record);//将record添加到末尾,-1表示添加到末尾
    stuModel->setSort(0,Qt::AscendingOrder);
    stuModel->select();//重新显示数据
    clearSlot();//清除QLineEdit对象中的数据
}



    完整代码链接:
链接:http://pan.baidu.com/s/1hrCofmk 密码:pwel

你可能感兴趣的:(Qt实例练习)