QSqlTableModel類爲單個數據庫表提供了一個可編輯的數據模型。QSqlTableModel是一個從單個表讀取和寫入數據庫記錄的高級接口。它構建在較低級別的QSqlQuery之上,並且可以用來提供數據給諸如QTableView的視圖類(以查看數據)。
1.在表格中查看QSqlite數據庫中的數據
例1:初始化實現一個表格;使用數據庫中的哪個表格等信息在drawingTable中實現
//初始化
mdiArea = new QWidget;//mainwindow中的主widget
setCentralWidget(mdiArea);
tableview = new QTableView;
itemModel = new QStandardItemModel;
itemModel->setColumnCount(4);
layout = new QVBoxLayout(this);
layout->addWidget(tableview);
mdiArea->setLayout(layout);
drawingTable();
void MainWindow::drawingTable()
{
model = new QSqlTableModel(mdiArea);//基於主widget
model->setTable("student");//數據庫中表的名字
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
bool isSelect = model->select();//選擇整張表
tableview->setModel(model);//爲表設置model
}
結果:
例2:
將數據庫修改成GUI_主接線圖
void MainWindow::drawingTable()
{
model = new QSqlTableModel(mdiArea);
//model->setTable("student");
model->setTable(tr("GUI_主接線圖"));
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
bool isSelect = model->select();
tableview->setModel(model);
}
結果:
2.修改數據
在上述代碼的基礎上,添加一個按鈕,按鈕的槽函數實現如下:
void MainWindow::slt_modify()
{
bool istrans = model->database().transaction();//開始事務操作
if (!istrans)
{
return;
}
if (model->submitAll())//是否等待變化,提交到緩存
{
model->database().commit();//修改的數據提交數據庫
}
else
{
model->database().rollback();//回滾
QMessageBox::warning(this,"tableModel","database error");
}
}
3.撤銷修改
void MainWindow::slt_cancel()
{
model->revertAll();//取消緩存中更改數據
}
例子:將下圖紅框中的30改爲80,然後按撤銷,由80改回30。但是點擊modify之後再點擊cancel就不能取消了。這個模型可以將所有修改先保存到model中,只有當我們執行提交修改後,纔會真正寫入數據庫。當然這也是因爲我們在最開始設置了它的保存策略。
4.查詢
添加一個按鈕,用於查詢符合條件的數據,其槽函數實現如下:
void MainWindow::slt_queryBtn()
{
QString queryStr = QObject::tr("time = '%1'").arg("2019-12-28 14:37:35.110");
model->setFilter(queryStr);
model->select();
}
點擊query按鈕的顯示結果:
繼續顯示所有數據:
void MainWindow::slt_queryAllDataBtn()
{
model->setTable(tr("SOE記錄"));
model->select();
}
5.排序
升序:
void MainWindow::slt_sortAscBtn()
{
model->setSort(0,Qt::AscendingOrder);//按id升序排列,0是第1列
model->select();
}
結果:
降序:槽函數
void MainWindow::slt_sortDesBtn()
{
model->setSort(0, Qt::DescendingOrder);//按id降序排列,0是第1列
model->select();
}
結果:
6.刪除操作
槽函數實現如下:
void MainWindow::slt_delBtn()
{
int row = tableview->currentIndex().row();
model->removeRow(row);
int ok = QMessageBox::warning(this, tr("刪除當前行!"), tr("確定刪除當前行嗎"),
QMessageBox::Yes, QMessageBox::No);
if (ok == QMessageBox::No)
{
model->revertAll(); //如果不刪除,則撤銷
}
else
{
model->submitAll(); //否則提交,在數據庫中刪除該行
}
}
結果:刪除第5行
7.插入操作
槽函數實現如下:
void MainWindow::slt_insertBtn()
{
int rowNum = model->rowCount(); //獲得表的行數
int id = 5;
model->insertRow(rowNum); //添加一行
model->setData(model->index(rowNum, 0), id);
model->submitAll(); //可以直接提交
}