QDataWidgetMapper, QSqlRelationalTableModel, mapper 不会提交
QDataWidgetMapper, QSqlRelationalTableModel, mapper won't submit
我正面临一个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")。如果我调用模型的lastror,什么也不会显示。映射到这个映射器的字段是表的强制字段(id除外,因为它被标记为自动递增)。
任何帮助都非常感谢,因为我真的不明白(似乎也找不到)为什么这个小部件不添加任何东西到数据库。让我提一下,我用标准的SQLite数据库查看器检查了一下,以确保SQLite数据库的内容是这样的。
注::您可以在https://code.google.com/p/invensile/source/browse/#svn%2Ftrunk
浏览完整的代码以供参考。提前感谢!
虽然这个问题很古老,但我前几天也经历过同样的事情,
statusModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
该行的参数OnManualSubmit
强制您手动向数据库提交内容。因此,要在数据库中进行更改,我必须在调用mapper->submit()
之后调用statusModel->submitAll()
。
尝试使用submitAll代替submit
相关文章:
- 在Google Kick start中提交时出错
- 使用libcurl提交批量url的正确BING Api POST url是什么
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 使用 libgit2 创建 NOT INITIAL 提交
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 我的代码厨师提交显示错误的结果
- 在构建时执行execute_process以在构建时获取git提交哈希
- 为什么作业提交网站的输出与Visual Studio不同
- 向 Kattis 在线评委提交 c++ 程序时出现未知运行时错误
- 哪些 Netbeans 8.2 项目文件应提交到C++项目的版本控制?
- 如何在C++中预先提交分配的内存
- 将 Git 提交哈希读取到C++时出错
- Xcode 9 初始提交 所以只添加源文件
- 如何保存RNN的状态以从TF中的图中提交
- 在 C/C++ 源中包含 Git 提交哈希和/或分支名称
- 代码在我的系统上运行良好,但在 HackerRank 提交时出现分段错误
- Leetcode:为什么在提交和运行代码上,字符串类的“at”方法的行为不同
- 在尝试提交作业警告时,我一直在警告:与未指定行为的字符串字面结果比较[-WADDRESS]
- 如何在不调用 "-m" 选项的情况下自动化 git 提交来处理内部引号?
- QDataWidgetMapper, QSqlRelationalTableModel, mapper 不会提交