2011-05-01 3 views
0

Je suis confronté à un problème avec un Widget C++ Qt4. Ce widget doit être utilisé pour ajouter des lignes dans une base de données SQLite. Voici les tables de base de données qui sont utilisées dans le problème que je suis face:QDataWidgetMapper, QSqlRelationalTableModel, mapper ne pas soumettre

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

Le code que j'ai écrit, qui suit exactement le tutoriel Qt SQL WidgetMapper, suit:

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

Le processus de soumission est aussi simple comme suit:

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

Le problème est que mapper-> submit() a échoué ("false" est affiché). Si j'appelle lastError du modèle, rien ne s'affiche. Les champs qui sont mappés à ce mappeur sont les champs obligatoires de la table (id excepté car il est marqué comme autoincrement).

Toute aide est grandement appréciée car je ne comprends vraiment pas (et ne peux pas sembler savoir) pourquoi ce widget n'ajoute rien à la base de données. Permettez-moi de mentionner que j'ai vérifié avec une visionneuse de base de données SQLite standard pour être sûr du contenu de la base de données SQLite.

P.S .: Vous pouvez parcourir le code complet pour référence à https://code.google.com/p/invensile/source/browse/#svn%2Ftrunk

Merci à l'avance!

Répondre

-1

Essayez d'utiliser submitAll au lieu de soumettre.

+2

Veuillez voir [réponse] pour quelques directives sur la rédaction de meilleures réponses, plus utiles. – brc

0

Bien que la question est très ancienne, mais je l'ai vécu la même chose il y a quelques jours,

statusModel->setEditStrategy(QSqlTableModel::OnManualSubmit); 

l'argument OnManualSubmit de la ligne vous oblige à soumettre manuellement le contenu à database.So, pour apporter des changements dans la base de données, j'ai dû appeler statusModel->submitAll() après avoir appelé mapper->submit().