2011-05-01 53 views
0

我正面臨一個C++ Qt4 Widget的問題。這個小部件將用於將行添加到SQLite數據庫中。以下是它們在我所面臨的問題,使用的數據庫表:QDataWidgetMapper,QSqlRelationalTableModel,mapper不會提交

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,則不會顯示任何內容。映射到該映射器的字段是該表的必填字段(由於標記爲自動增量,因此該標識除外)。

任何幫助是非常感謝,因爲我真的不明白(而且似乎無法找到)爲什麼這個小部件沒有添加任何東西到數據庫。讓我來提一下,我使用標準的SQLite數據庫查看器進行了檢查,以確定SQLite數據庫的內容是這樣的。

P.S:您可以在https://code.google.com/p/invensile/source/browse/#svn%2Ftrunk

感謝瀏覽完整的代碼以供參考提前!

回答

-1

嘗試使用submitAll而不是提交。

+2

請參閱[答]關於編寫更好,更有幫助的答案的一些指導原則。 – brc 2011-11-12 03:22:38

0

雖然問題很老了,但我已經經歷了同樣的事情,前幾天,

statusModel->setEditStrategy(QSqlTableModel::OnManualSubmit); 

線的參數OnManualSubmit強迫你手動提交內容database.So,做出改變在數據庫中,我必須在致電mapper->submit()後致電statusModel->submitAll()