QtSql模块由驱动层、SQL接口层、用户接口层三部分组成,提供了与平台以及数据库种类无关的访问SQL数据库的接口。这个接口由利用Qt的模型/视图结构将数据库与用户界面集成的一套类来支持,数据库即模型的数据源。对于习惯使用SQL语法的用户,QSqlQuery类提供了直接执行任意SQL语句并处理返回结果的方法;而对于习惯使用较高层数据库接口避免使用SQL语句的用户,QSqlTableModel和QSqlRelationModel类提供了合适的抽象。
Qt使用驱动程序与各种数据库的应用编程接口进行通信。Qt的桌面版包含的驱动程序有:QSQLITE、QMYSQL、QODBC等。
对数据库的操作主要包括:连接、增、删、改、查等。
下面主要讲解Qt在模型(QSqlTableModel)-视图(QTableView)结构下对MySQL数据库的操作 ( 对于使用SQL类的应用程序,要在.pro文件中添加 QT += sql )。
1、连接
此操作我在我的上一篇博文http://www.cnblogs.com/gaohongchen01/p/4530765.html中已讲述。
QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setDatabaseName("ghcDB"); db.setUserName("root"); db.setPassword("123456");
if(!db.open()) { qDebug()<<db.lastError().text()<<endl; return false; }
2、增
QSqlTableModel *modelTable=new QSqlTableModel(this); modelTable->setTable(strTableName); modelTable->select();
int row=modelTable->rowCount();
modelTable->insertRows(row,1); modelTable->setData(modelTable->index(row,0),addDataDlg.editName->text()); if("男"==addDataDlg.comboSex->currentText()) modelTable->setData(modelTable->index(row,1),"M"); if("女"==addDataDlg.comboSex->currentText()) modelTable->setData(modelTable->index(row,1),"F"); modelTable->setData(modelTable->index(row,2),addDataDlg.editAge->text());
modelTable->submitAll();
3、删
QSqlTableModel *modelTableInfoOldSelected=new QSqlTableModel(this);
modelTableInfoOldSelected->setTable(strTableName);
modelTableInfoOldSelected->select();
modelTableInfoOldSelected->removeRows(rowSelected,1);
modelTableInfoOldSelected->submitAll();
4、改
QSqlTableModel *modelTable=new QSqlTableModel(this); modelTable->setTable(strTableName); modelTable->select(); int row=rowSelected;
modelTable->setData(modelTable->index(row,0),changeDataDlg.editName->text()); if("男"==changeDataDlg.comboSex->currentText()) modelTable->setData(modelTable->index(row,1),"M"); if("女"==changeDataDlg.comboSex->currentText()) modelTable->setData(modelTable->index(row,1),"F"); modelTable->setData(modelTable->index(row,2),changeDataDlg.editAge->text());
modelTable->submitAll();
5、查
QSqlQueryModel *modelQuery=new QSqlQueryModel; modelQuery->setQuery(tr("select Name,Sex,Age from %1").arg(strTableName));
modelQuery->setHeaderData(0,Qt::Horizontal,tr("姓名")); modelQuery->setHeaderData(1,Qt::Horizontal,tr("性别")); modelQuery->setHeaderData(2,Qt::Horizontal,tr("年龄"));
tableView->setModel(modelQuery);
6、读取数据库某一条记录中各字段的值给控件
QSqlTableModel *modelTableInfoOldSelected=new QSqlTableModel(this); modelTableInfoOldSelected->setTable(strTableName); modelTableInfoOldSelected->select(); QSqlRecord record=modelTableInfoOldSelected->record(rowSelected); editName->setText(record.value("Name").toString()); if("M"==record.value("Sex").toString()) comboSex->setCurrentIndex(0); else if("F"==record.value("Sex").toString()) comboSex->setCurrentIndex(1); editAge->setText(record.value("Age").toString());