QSqlTableModel 操作探究

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(); //可以直接提交  
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章