C++ 单击以从可编辑的QAbstractTableModel更新数据库

C++ 单击以从可编辑的QAbstractTableModel更新数据库,c++,qt,C++,Qt,可编辑表视图连接到从数据库填充的自定义模型(QAbstractTableModel的子类)。表格视图的编辑值临时保存在2DQVector中 目标是在表视图下面有一个按钮来触发数据库的更新 问题是,我似乎无法理解这方面的信号&插槽机制。这似乎是一个按钮的范围问题,我想,但我不知道如何解决它 前两个文件仅供概述,问题(可能)在setData()中的第三个文件中 我还是这个框架的初学者,所以为一个潜在的愚蠢问题道歉 在设计模式下制作了一个表视图(“menuTable”)和一个按钮(“menuTabl

可编辑表视图连接到从数据库填充的自定义模型(QAbstractTableModel的子类)。表格视图的编辑值临时保存在2D
QVector

目标是在表视图下面有一个按钮来触发数据库的更新

问题是,我似乎无法理解这方面的
信号
&
插槽
机制。这似乎是一个按钮的范围问题,我想,但我不知道如何解决它

前两个文件仅供概述,问题(可能)在
setData()中的第三个文件中

我还是这个框架的初学者,所以为一个潜在的愚蠢问题道歉

  • 在设计模式下制作了一个表视图(“menuTable”)和一个按钮(“menuTableUpdateButton”)
  • mainwindow.cpp(打开数据库连接,查询数据库,将结果放入QVector,初始化并分配模型)
。。。
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
//数据库连接
...
//开放数据库
if(db.open())
{
...       
//用于保存要传递到模型中的查询的二维数组
QVectorsqlQueryVector;
...
//查询和存储结果
...        
//初始化QAbstractTableModel并将其传递到菜单表中
//将保存sql查询结果的id(int)和2D QVector传递给模型
menuTableModel*modelMenu=新建menuTableModel(id,sqlQueryVector);
ui->menuTable->setModel(模型菜单);
}
其他的
{
...
}
}
  • menutablemodel.h(基本初始化)
\ifndef MENUTABLEMODEL\u H
#定义菜单模型
#包括
#包括
类menuTableModel:公共QAbstractTableModel
{
Q_对象
公众:
显式菜单模型(常量int&monId,常量QVector&qry,QObject*parent=0)
:QAbstractTableModel(父)、mondayId(monId)、query(qry){}
int rowCount(常量QModelIndex&parent=QModelIndex())常量;
int columnCount(常量QModelIndex&parent=QModelIndex())常量;
QVariant数据(常量QModelIndex&index,int-role=Qt::DisplayRole)常量;
QVariant headerData(int段,Qt::Orientation-Orientation,int-role)常量;
bool setData(常量QModelIndex和index,常量QVariant和value,int role=Qt::EditRole);
Qt::ItemFlags flags(常量QModelIndex&index)常量;
void setQuery(const QVector&query);
void setId(const int&stId);
私人:
国际星期一;
QVector查询;
信号:
无效编辑已完成(常量QString&);
插槽:
void updateDatabase();
};
#endif//MENUTABLEMODEL\u H
  • menutablemodel.cpp(将数据分配到表中,编辑并保存到数据库)
#包括“menutablemodel.h”
#包括
#包括
int menuTableModel::rowCount(常量QModelIndex&/*parent*/)常量{…}
int menuTableModel::columnCount(常量QModelIndex&/*parent*/)常量{…}
QVariant menuTableModel::data(常量QModelIndex&index,int角色)常量{…}
QVariant menuTableModel::headerData(int节,Qt::Orientation,int角色)常量{…}
//编辑并保存到数据库中
bool menuTableModel::setData(常量QModelIndex和index、常量QVariant和value、int角色)
{
如果(角色==Qt::EditRole)
{
查询[index.row()][index.column()]=value.toString();
QString结果;
for(int row=0;rowqDebug()在您的
主窗口
构造函数中,您有模型和按钮,因此这是连接它们的最佳位置:

MainWindow::MainWindow(QWidget *parent)
 : QMainWindow(parent),
   ui(new Ui::MainWindow) 
{
     ui->setupUi(this);

     //opening database
     if(db.open()) {
          //...   
          menuTableModel* modelMenu = new  menuTableModel(id, sqlQueryVector);
          ui->menuTable->setModel(modelMenu); 

          // Connect button click to model update
          connect(ui->menuTableUpdateButton, SIGNAL(clicked()),
                  modelMenu, SLOT(updateDatabase()));

      }
}

这绝对有效。Scope仍然让我有点困惑,我整天都在考虑这个问题。非常感谢!
#ifndef MENUTABLEMODEL_H
#define MENUTABLEMODEL_H

#include <QAbstractTableModel>
#include <QVector>

class menuTableModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    explicit menuTableModel(const int &monId, const QVector< QVector<QString> > &qry, QObject *parent = 0)
    : QAbstractTableModel(parent), mondayId(monId),query(qry) {}

    int rowCount(const QModelIndex &parent = QModelIndex()) const ;
    int columnCount(const QModelIndex &parent = QModelIndex()) const;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
    bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
    Qt::ItemFlags flags(const QModelIndex & index) const ;
    void setQuery(const QVector< QVector<QString> > &query);
    void setId(const int &stId);

private:
    int mondayId;
    QVector< QVector<QString> > query;

signals:
    void editCompleted(const QString &);

slots:
    void updateDatabase();

};
#endif // MENUTABLEMODEL_H
#include "menutablemodel.h"
#include <QDebug>
#include <QSqlQuery>

int menuTableModel::rowCount(const QModelIndex & /*parent*/) const {...}

int menuTableModel::columnCount(const QModelIndex & /*parent*/) const  {...}

QVariant menuTableModel::data(const QModelIndex &index, int role) const {...}

QVariant menuTableModel::headerData(int section, Qt::Orientation orientation, int role) const {...}

//edit and save into database
bool menuTableModel::setData(const QModelIndex & index, const QVariant & value, int role)
{
if (role == Qt::EditRole)
{
    query[index.row()][index.column()] = value.toString();        
    QString result;
    for(int row= 0; row < query.size(); row++)
    {
        for(int col= 0; col < query[0].size(); col++)
        {
            result += query[row][col] + " ";
        }
    }
    emit editCompleted( result );
     qDebug() << "result is: " << result;

    //update database here with connect??
    //connect(menuTableUpdateButton, SIGNAL (clicked()), this, SLOT (updateDatabase()));


    }
    return true;
}


Qt::ItemFlags menuTableModel::flags(const QModelIndex & /*index*/) const {...}

void menuTableModel::setQuery(const QVector< QVector<QString> > &qry) {
    query = qry;
}

void menuTableModel::setId(const int &stId) {...}

void menuTableModel::updateDatabase() {
   //write SqlQuery here  
   ...
}
MainWindow::MainWindow(QWidget *parent)
 : QMainWindow(parent),
   ui(new Ui::MainWindow) 
{
     ui->setupUi(this);

     //opening database
     if(db.open()) {
          //...   
          menuTableModel* modelMenu = new  menuTableModel(id, sqlQueryVector);
          ui->menuTable->setModel(modelMenu); 

          // Connect button click to model update
          connect(ui->menuTableUpdateButton, SIGNAL(clicked()),
                  modelMenu, SLOT(updateDatabase()));

      }
}