我正面臨一個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
感謝瀏覽完整的代碼以供參考提前!
請參閱[答]關於編寫更好,更有幫助的答案的一些指導原則。 – brc 2011-11-12 03:22:38