Редактируемый вид таблицы связан с пользовательской моделью (подкласс 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-запроса в базе данных?
Это абсолютно работает. Сфера немного меня смущает, я обдумывал это в течение всего дня. Спасибо огромное! –