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()<<err.text();}
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();//上图中左边的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);
}
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;
}
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();//重新选择数据
}
void MainWindow::selectSlot()
{
QString name =seLineEdit->text();
if(name.isEmpty())
return;
//qDebug()<<name;
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()<<id<<name<<age<<major<<credit<<address;
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对象中的数据
}