点击更新数据库,来自可编辑的QAbstractTableModel

时间:2016-02-22 18:21:44

标签: c++ qt

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

目标是在表视图下方按下按钮以触发数据库的更新。

问题在于,我无法为此找出SIGNAL& SLOT机制。我认为这似乎是按钮范围的问题,但我不知道如何解决它。

前两个文件只是为了概述,问题是(可能)在第三个,setData()

我仍然是这个框架的初学者,所以对一个可能愚蠢的问题道歉。

  • tableView(" menuTable ")和pushButton(" menuTableUpdateButton ")在设计模式下制作。
  • mainwindow.cpp (打开数据库连接,查询数据库,将结果放入QVector并初始化和分配模型)
...
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow) 
{
     ui->setupUi(this);

     //database connection
     ...
     //opening database
     if(db.open())
          {
          ...       
          //2D array to hold the query to pass into model        
          QVector< QVector<QString> > sqlQueryVector; 
          ...
          //querying and storing the result
          ...        
          //initialize QAbstractTableModel and pass it into the menu table
          //passing an id(int) and a 2D QVector that holds the sql query result to the model
          menuTableModel* modelMenu = new  menuTableModel(id, sqlQueryVector);
          ui->menuTable->setModel(modelMenu);        
          }
     else
          {
          ...
          }
}
  • menutablemodel.h (基本初始化)
#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
  • menutablemodel.cpp (将数据分配到表格,编辑和保存到数据库)
#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  
   ...
}

我的主要问题是在哪里以及如何定义SIGNAL&amp; SLOT命令以将被点击的按钮连接到执行SQL查询到数据库?

1 个答案:

答案 0 :(得分:0)

MainWindow构造函数中,您拥有模型和按钮,因此这是连接它们的最佳位置:

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()));

      }
}