0

C++ Qt4 ウィジェットの問題に直面しています。このウィジェットは、SQLite データベースに行を追加するために使用されます。私が直面している問題で使用されているデータベーステーブルは次のとおりです。

CREATE TABLE 'statuses' ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , 'name' VARCHAR(50) NOT NULL UNIQUE , 'bgcolor' VARCHAR(6) NOT NULL DEFAULT ffffff, 'fgcolor' VARCHAR(6) NOT NULL DEFAULT 000000)
CREATE TABLE 'addresses' ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , 'name' VARCHAR(50) NOT NULL UNIQUE , 'country' VARCHAR(25), 'town' VARCHAR(50), 'postal_code' VARCHAR(10), 'street' TEXT check(typeof('street') = 'text') , 'ref' VARCHAR(5) NOT NULL , 'status_id' INTEGER NOT NULL, FOREIGN KEY(status_id) REFERENCES statuses(id))

私が書いたコードは、Qt チュートリアルのSQL WidgetMapperに正確に従っています。

CreateAddressDialog::CreateAddressDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::CreateAddressDialog)
{
    ui->setupUi(this);
    /* Set up "buddies" */
    ui->nameLabel->setBuddy(ui->nameLineEdit);
    ui->refLabel->setBuddy(ui->refLineEdit);
    ui->townLabel->setBuddy(ui->townLineEdit);
    ui->streetLabel->setBuddy(ui->streetLineEdit);
    ui->countryLabel->setBuddy(ui->countryLineEdit);
    ui->postalCodeLabel->setBuddy(ui->postalCodeLineEdit);
    ui->statusLabel->setBuddy(ui->statusCB);

    /* Set up status model */
    ui->statusCB->clear();
    statusModel = new QSqlRelationalTableModel(this, backbone::instance()->db);
    statusModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    statusModel->setTable("addresses");
    int statusFieldId = statusModel->fieldIndex("status_id");
    /***** Warning: after next instruction fieldIndex('status_id') will return -1. */
    statusModel->setRelation(statusFieldId,QSqlRelation("statuses", "id", "name"));
    statusModel->select();
    relModel = statusModel->relationModel(statusFieldId);
    ui->statusCB->setModel(relModel);
    ui->statusCB->setModelColumn(relModel->fieldIndex("name"));
    mapper = new QDataWidgetMapper(this);
    mapper->setItemDelegate(new QSqlRelationalDelegate(this));
    mapper->setModel(statusModel);
    mapper->addMapping(ui->refLineEdit, statusModel->fieldIndex("ref"));
    mapper->addMapping(ui->nameLineEdit, statusModel->fieldIndex("name"));
    mapper->addMapping(ui->statusCB, statusFieldId);
}

提出プロセスは次のように簡単です。

void CreateAddressDialog::accept()
{
    if(ui->nameLineEdit->text().length() < 5){
        QMessageBox::critical(0, tr("Error"),tr("The name must be at least 5 characters long."), QMessageBox::Cancel);
        return;
    }else if(ui->refLineEdit->text().length() > 10){
        QMessageBox::critical(0, tr("Error"),tr("The reference may not be more than 10 characters long."), QMessageBox::Cancel);
        return;
    }else if(ui->statusCB->currentIndex() < 0){
        QMessageBox::critical(0, tr("Error"),tr("The item must have a status."), QMessageBox::Cancel);
        return;
    }
    qDebug() << mapper->submit();
    this->close();
}

問題は、mapper->submit() が失敗したことです ("false" が表示されます)。モデルの lastError を呼び出すと、何も表示されません。このマッパーにマップされるフィールドは、テーブルの必須フィールドです (自動インクリメントとしてマークされているため、id は除外されます)。

このウィジェットがデータベースに何も追加しない理由が本当にわからない (そして見つけられないように見える) ので、どんな助けも大歓迎です。SQLite データベースの内容がどのようなものであるかを確認するために、標準の SQLite データベース ビューアーでチェックしたことを述べておきます。

PS: https://code.google.com/p/invensile/source/browse/#svn%2Ftrunkで参照用の完全なコードを参照できます。

前もって感謝します!

4

2 に答える 2

0

質問は非常に古いですが、数日前に同じことを経験しましたが、

statusModel->setEditStrategy(QSqlTableModel::OnManualSubmit);

行の引数OnManualSubmitは、内容をデータベースに手動で送信することを強制しています。そのため、データベースを変更するには、 を呼び出しstatusModel->submitAll()た後に呼び出す必要がありましたmapper->submit()

于 2016-04-06T16:23:22.887 に答える
-1

submit の代わりに submitAll を使用してみてください。

于 2011-11-12T02:56:15.177 に答える