天天看點

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

根據上一次的讨論,這次我們來研究一下QSqlTableModel的添加方法。

首先建立一個Qt界面類

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

用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檔案略
           

然後稍微設計一下界面視窗

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

這個界面就是添加的資料了,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'南京')
           

如圖!

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

做到這個地步大家會發現,在打開界面後直接關閉,仍然有空資料插入到資料庫中。那是因為在執行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/

~~~

繼續下一章:删除功能

繼續閱讀