QSqlTableModel是Qt中的一个模型类,用于访问数据库表格中的数据。它继承自QAbstractTableModel,具有QAbstractTableModel的所有特性和功能,同时还提供了与数据库相关的接口以及自动更新功能。使用QSqlTableModel可以方便地将数据库表格中的数据显示在Qt的视图组件中,比如QTableView。
下面是一个使用QSqlTableModel的示例:
#include <QSqlDatabase>
#include <QSqlTableModel>
#include <QTableView>
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
// 连接数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("test");
db.setUserName("root");
db.setPassword("password");
if (!db.open()) {
qDebug() << "Failed to connect to database";
return -1;
}
// 创建QSqlTableModel对象
QSqlTableModel* model = new QSqlTableModel();
// 设置QSqlTableModel的数据表 即查询student的表
model->setTable("students");
// 设置QSqlTableModel的编辑策略
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
// 加载数据
model->select();
// 创建QTableView对象
QTableView* tableView = new QTableView();
// 设置QTableView的模型
tableView->setModel(model);
// 显示QTableView
tableView->show();
return app.exec();
}
该示例代码连接了一个名为test的MySQL数据库,然后创建了一个QSqlTableModel对象,将其数据表设置为students。接着,设置了QSqlTableModel的编辑策略为OnManualSubmit,表示只有在手动提交的情况下才会更新数据库。然后,调用select()方法加载数据,并将QSqlTableModel设置为QTableView的模型,最后显示QTableView。这样就可以将students表格中的数据显示在QTableView中。
需要注意的是,QSqlTableModel只能用于单表查询,如果需要进行多表查询,应该使用QSqlQueryModel。此外,QSqlTableModel还提供了一些其他的接口,比如setData()、insertRows()、removeRows()等,用于对数据库进行增删改操作。
2.实现增删查改
#include <QSqlDatabase>
#include <QSqlTableModel>
#include <QTableView>
#include <QSqlRecord>
#include <QSqlField>
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
// 连接数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("test");
db.setUserName("root");
db.setPassword("password");
if (!db.open()) {
qDebug() << "Failed to connect to database";
return -1;
}
// 创建QSqlTableModel对象
QSqlTableModel* model = new QSqlTableModel();
// 设置QSqlTableModel的数据表
model->setTable("students");
// 设置QSqlTableModel的编辑策略
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
// 加载数据到模型中
model->select();
// 创建QTableView对象
QTableView* tableView = new QTableView();
// 设置QTableView的模型
tableView->setModel(model);
// 显示QTableView
tableView->show();
// 插入数据
QSqlRecord record;
QSqlField idField("id", QVariant::Int);
QSqlField nameField("name", QVariant::String);
QSqlField ageField("age", QVariant::Int);
idField.setAutoValue(true);
nameField.setValue("Tom");
ageField.setValue(20);
record.append(idField);
record.append(nameField);
record.append(ageField);
model->insertRecord(-1, record);
// 删除数据
int row = 0; // 要删除的行号
model->removeRow(row);
// 修改数据
int row = 0; // 要修改的行号
int column = 1; // 要修改的列号
QVariant value = "Jerry"; // 修改后的值
model->setData(model->index(row, column), value);
// 提交数据更改
model->submitAll();
return app.exec();
}
该示例代码连接了一个名为test的MySQL数据库,然后创建了一个QSqlTableModel对象,将其数据表设置为students。接着,设置了QSqlTableModel的编辑策略为OnManualSubmit,表示只有在手动提交的情况下才会更新数据库。然后,调用select()方法加载数据,并将QSqlTableModel设置为QTableView的模型,最后显示QTableView。
在示例代码的后面,通过insertRecord()方法插入了一条新数据,通过removeRow()方法删除了一条数据,通过setData()方法修改了一条数据的值。最后,通过submitAll()方法提交数据更改。
需要注意的是,QSqlTableModel的insertRecord()和removeRow()方法只是将数据插入或删除到模型中,并不会立即更新数据库。如果要更新数据库,需要调用submitAll()或submitRow()方法。对于修改数据的操作,setData()方法会自动提交更改,不需要再调用submitAll()方法。