根據上一次的讨論,這次我們來研究一下QSqlTableModel的添加方法。
首先建立一個Qt界面類

用dialog界面,因為我們需要dialog的exec()接口。命名為
AddRecord
。内部結構大緻為
// h檔案
#ifndef AddRecord_H
#define AddRecord_H
#include <QDialog>
namespace Ui {
class AddRecord;
}
class AddRecord : public QDialog
{
Q_OBJECT
public:
explicit AddRecord(QWidget *parent = nullptr);
~AddRecord();
QString * str;
private slots:
void on_pushButton_clicked();
private:
Ui::AddRecord *ui;
};
#endif // AddRecord_H
// cpp
#include "AddRecord.h"
#include "ui_AddRecord.h"
AddRecord::AddRecord(QWidget *parent) :
QDialog(parent),
ui(new Ui::AddRecord)
{
ui->setupUi(this);
this->str = new QString[3];
}
AddRecord::~AddRecord()
{
delete ui;
}
void AddRecord::on_pushButton_clicked()
{
this->str[0] = ui->lineEdit->text();
this->str[1] = ui->lineEdit_2->text();
this->str[2] = ui->lineEdit_3->text();
this->hide();
}
// ui檔案略
然後稍微設計一下界面視窗
這個界面就是添加的資料了,id是我們設定的主鍵值,随資料自動增長,是以不需要手動輸入。
既然是添加操作,我們肯定要添加槽函數,在主ui下的添加按鈕右擊選擇“轉到槽”,一般選擇預設的click()函數即可。
在.cpp函數下會顯示
void MainWindow::on_pushButton_clicked()
{
}
在此輸入添加代碼即可
void MainWindow::on_pushButton_clicked()
{
AddRecord * add = new AddRecord(this);//建立界面對象
add->exec();//顯示界面,且程序停止在此,除add界面外無法操作其它界面
QString *str = add->str;
//以下就是插入函數的基本語句了
QSqlTableModel * model = new QSqlTableModel(this,db);
model->setTable("EXAMPLE");
int row = model->rowCount();
model->insertRow(row);
model->setData(model->index(row,1),str[0]);
model->setData(model->index(row,2),str[0]);
model->submitAll();//送出插入的資料
ui->tableView->setModel(model);//設定model模型
model->select();//顯示
}
以上語句相當于插入資料語句
insert into EXAMPLE (name,age,city) values ('張三',22'南京')
如圖!
做到這個地步大家會發現,在打開界面後直接關閉,仍然有空資料插入到資料庫中。那是因為在執行exec後,無論怎樣關閉,都會繼續執行插入的後續語句,是以我們要在exec()後添加使用者是否按下完成按鈕的判斷。
在addrecord.h中添加語句
public:
bool isClicked = false;
在addrecord.cpp中void AddRecord::on_pushButton_clicked()添加
isClicked = true;
原插入函數修改為
void MainWindow::on_pushButton_clicked()
{
AddRecord * add = new AddRecord(this);
add->exec();
if(!add->isClicked)
return;
QString *str = add->str;
QSqlTableModel * model = new QSqlTableModel(this,db);
model->setTable("EXAMPLE");
int row = model->rowCount();
model->insertRow(row);
model->setData(model->index(row,1),str[0]);
model->setData(model->index(row,2),str[1].toInt());
model->setData(model->index(row,3),str[2]);
model->submitAll();//送出插入的資料
ui->tableView->setModel(model);//設定model模型
model->select();//顯示
}
這個時候隻要不點選完成按鈕就不會有資料插入了!
。
。
。
。
。
。
!!!在此申明一下為什麼用exec() 接口!!!
比如說insertDialog使用exec顯示界面,程式會進入循環,等待你對執行exec這個insertDialog的操作。當你關閉insertDialog類視窗時,程式會繼續執行接下來的代碼,是以當你在exec循環裡時,原視窗會拒絕一切操作。
而如果使用show的話,你會發現對話框會很快自動關閉,因為,show不會進入循環,它執行完後會繼續執行下面語句,而你什麼都沒輸入,完全不顧及你的感受!
具體參考大佬解釋:https://www.devbean.net/2012/09/qt-study-road-2-dialogs-intro/
~~~
繼續下一章:删除功能