根据上一次的讨论,这次我们来研究一下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/
~~~
继续下一章:删除功能