小白QT tableView實時修改同步到QSqlTableModel MODEL 即時修改資料庫

hyl520m發表於2020-12-08

小白QT tableView實時修改同步到QSqlTableModel MODEL 即時修改資料庫

tableView實時修改資料庫

程式碼如下(示例):

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QString name,QWidget *parent = nullptr);
    ~MainWindow();
   
signals:
    //過載dataChanged 格式就是這個,引數不對就沒得訊號了
    void dataChanged(QModelIndex,QModelIndex);
private slots:
	//槽函式
    void ChangeData(QModelIndex);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

 #include "mainwindow.h"
#include "ui_mainwindow.h"



MainWindow::MainWindow(QString name,QWidget *parent) :
    user(name),
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
   
    //過載datachange訊號 傳送QModelIndex類引數,傳遞給ChangeData
    connect(model,SIGNAL(dataChanged(QModelIndex,QModelIndex)),this,SLOT(ChangeData(QModelIndex)));
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::ChangeData(QModelIndex x)
{
    bool y=model->setData(model->index(x.row(),x.column()),x.data()); //x.data()返回QVariantl型別資料 QVariant內建支援所有QMetaType::Type裡宣告的型別如:int,QString,QFont,QColor等,甚至QList,QMap<QString, QVariant>等組成的任意複雜型別。
   
    if(y){                       
    model->submitAll();
    }
    else {
        model->blockSignals(true);//阻塞datachange訊號傳送,沒這句about會彈兩次
        model->revertAll();
        QMessageBox::about(this,"修改失敗","請檢查修改資料!");
    }
}






總結

找了好久的方法最後幾行程式碼就解決了。。不過還有很多問題沒處理,只是能跑,不管了,先能用再說吧~

相關文章