Qt使用QSqlTableModel界面显示用法(二、添加功能)

根据上一次的讨论,这次我们来研究一下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/

~~~
继续下一章:删除功能

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值