Qt练习1:学生信息管理说明:初学Qt,程序有很多不完善的地方,而且用的方法页是笨方法,刚完成,此为版本1,后续会添加其他功能。有问题的地方欢迎大家指正。
下面是本设计的界面图片,很简单,但涉及到了数据库,模型视图,布局等知识点,像我一样的新手可用来练手还可以的。
操作:左边表格的某一行被选中,右边的QWigetList立即显示出所有信息;
选择一行,点击删除按钮即可删除;
QLineEdit对象中输入名字,点击查找,得到所需信息,同时点击返回列表按钮,就可返回到全表;
点击添加按钮,可出一个添加对话框,如下:
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()<}
elseui->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();//上图中左边的boxQGroupBox *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索引,会在删除时用到此idQString 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