Несоответствие количества параметров SQL в QTableView - PullRequest
0 голосов
/ 05 марта 2019

У меня есть графический интерфейс, состоящий из:

N.1 GraphicsView

N.1 QTableView

N.1, которое открывается по мере необходимости пользователем после двойного щелчкав каждом ряду QTableView

я могу захватывать объекты в QGraphicsView одним щелчком мыши.После того, как объект нарисован, я щелкаю правой кнопкой мыши и открываю диалоговое окно, подобное показанному на рисунке:

Dialog

После нажатия кнопки accept: я регистрирую объект как индекс строки в QTableViewкак показано ниже:

Dialog_after_accepting

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

Проблема, с которой я столкнулся в настоящее время, заключается в том, что я получаю странный Parameter count mismatch от компилятора, и я не понимаю, почему, и это должно быть из-за QSQLITE

Ниже приведено то, что яЯ пытаюсь сделать вместе с самой важной частью кода:

parameters.h

typedef struct Param
{
    int mId;
    QString mName;
    QByteArray mSave;
} Param;

class Parameters
{
public:
    Parameters() = default;
    Parameters(Param newdata);
    Parameters(int id, const QString &name, const QByteArray &save);
    int id() const { return data.mId; }
    QString name() const {return data.mName; }
    QByteArray save() const {return data.mSave; }
    Param getData() const { return data; }
    void setData(Param ndat) { data = ndat; }
private:
    Param data;
};

parameters.cpp

#include "parameters.h"
Parameters::Parameters(Param newdata) {
    data = newdata;
}
Parameters::Parameters(int id, const QString &name,
                               const QByteArray &save) {
    data.mId = id;
    data.mSave = save;
    data.mName = name;
}

база данных установлена ​​в следующем dataleftcamera.h part:

public:
    explicit dataLeftCamera(QObject *parent = nullptr);
    bool addItem(Parameters* mParameters);
    bool updateItem(int itemId, Parameters* mParameters);
    QSqlDatabase getDatabase();
private:
    QString mError;
    QSqlDatabase mDatabaseLeft;

Таблица инициируется здесь на dataleftcamera.cpp и здесьгде компилятор выдает ошибку Parameter count mismatch специально для функции updateItem

#define CREATE_TABLE \
    " CREATE TABLE IF NOT EXISTS leftCamTable" \
    " (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" \
    ", name TEXT NOT NULL" \
    ", save BLOB NOT NULL)"

dataLeftCamera::dataLeftCamera(QObject *parent) : QObject (parent)
{}

bool dataLeftCamera::addItem(Parameters *mParameters)
{
    QSqlQuery qry;
    qry.prepare("INSERT INTO leftCamTable (name, save)"\
                " VALUES (?,?)");
    qry.addBindValue(mParameters->name());
    qry.addBindValue(mParameters->save());

    bool ok = qry.exec();
    if(!ok) {
        mError = qry.lastError().text();
        qDebug() << mError;
    }
}

bool dataLeftCamera::updateItem(int itemId, Parameters *mParameters)
{
    QSqlQuery qry;
    qry.prepare(" UPDATE lefCamTable SET " \
                " name = ?," \
                " save = ?" \
                " WHERE id = ?");
    qry.addBindValue(mParameters->name());
    qry.addBindValue(mParameters->save());
    qry.addBindValue(itemId);

    bool ok = qry.exec();
    if(!ok) {
        mError = qry.lastError().text();
        qDebug() << mError;
    }
}

для mainwindow.cpp - это часть, в которой я обновляю элемент после I doubleclick в строке изменить имя изображения и снова принять модификацию:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    mDatabaseLeftCamera = new dataLeftCamera(this);
    mModelLeftCamera = nullptr;
    mModelLeftCamera = new QSqlTableModel(this);
    ui->tableView->setModel(mModelLeftCamera);
    connect(ui->tableView, SIGNAL(doubleClicked(QModelIndex)),
            this, SLOT(onTableClick(QModelIndex)));
// temporary folder
    temporaryFolder = "/home/name/Desktop/tempDBFolder/tmp.db";
    QFile dbRem(temporaryFolder);
    dbRem.remove();
    mDatabaseLeftCamera->inizializationDatabaseLeftCamera(temporaryFolder);
    mDatabaseLeftCamera->configurationDatabaseLeftCamera();
    mModelLeftCamera = new QSqlTableModel(this, mDatabaseLeftCamera->getDatabase());
    mModelLeftCamera->setTable("leftCamTable");
    mModelLeftCamera->select();
    ui->tableView->setModel(mModelLeftCamera);
    ui->tableView->showColumn(true);
}

// opening the dialog for the first time after capturing the image
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
    // operations

    Param result = d.getData();
    Parameters* param = new Parameters(result);
    mDatabaseLeftCamera->addItem(param);
    mModelLeftCamera->select();
    ui->tableView->show();
}

// This is the doubleclick that re-opens the small dialog to change the name of the feature

void MainWindow::onTableClick(const QModelIndex &index)
{
    int row = index.row();
    Param currentData;
    int ItemId = index.sibling(row, 0).data().toInt();
    currentData.mName = index.sibling(row, 1).data().toString();
    currentData.mSave = index.sibling(row, 2).data().toByteArray();
    QPixmap iconPix;
    if(!iconPix.loadFromData(index.sibling(row, 2).data().toByteArray())) {
    }
    clipSceneDialog d(this);
    d.show();
    d.setData(currentData);
    d.setImage(iconPix.toImage());

    if(d.exec() == QDialog::Rejected) {
        return;
    } else {
        //
    }
    Param result = d.getData();
    Parameters* param = new Parameters(result);
    mDatabaseLeftCamera->updateItem(ItemId,param);
    mModelLeftCamera->select();
    ui->tableView->show();
}

Для полноты см. ошибку, выдаваемую компилятором, если это поможет:

compiler_error Яизвините, если это тривиально, но я проверил updateItem(ItemId,param) и спасибо, что пролил свет на это.

1 Ответ

0 голосов
/ 05 марта 2019

Попробуйте добавить отладочную печать.Специально для параметров, которые вы добавляете в подготовленное утверждение.qry.addBindValue преобразует ваше значение в QVariant.На основании документации QVariants становятся NULL, когда они не содержат данных:

QVariant x(QString());
// x.isNull() == true

В случае возникновения проблемы при получении ваших параметров, это может объяснить нарушение NOT NULL ограничения.

...