2016-02-22 1 views
0

Редактируемый вид таблицы связан с пользовательской моделью (подкласс QAbstractTableModel), который заполняет ее из базы данных. Измененные значения табличного вида временно сохраняются в 2D QVector.Нажмите, чтобы обновить базу данных, из редактируемого QAbstractTableModel

Целью нажатия кнопки под табличным представлением является запуск обновления базы данных.

Проблема в том, что я не могу представить, чтобы механизм SIGNAL & SLOT. Думаю, проблема в области нажатия кнопки, но я не знаю, как ее исправить.

Первые два файла для обзора, проблема (вероятно) в третьей, в setData().

Я все еще новичок в этой области, поэтому извиняюсь за потенциально глупый вопрос.

  • в Tableview ("menuTable ") и КНОПКА (" 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 & SLOT к подключить нажатие кнопки для выполнения SQL-запроса в базе данных?

ответ

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

     } 
} 
+0

Это абсолютно работает. Сфера немного меня смущает, я обдумывал это в течение всего дня. Спасибо огромное! –

Смежные вопросы