0
我做了这个简单的对话框来显示我遇到的问题,对话框只是一个QTableView
和QSqlRelationalTableModel
。问题是我无法保存视图,即使数据更改不是任何相关表。但是如果我注释掉关系,就像下面的代码一样,我可以更新没有问题。当有外键在场时是否有额外的步骤来保存信息?更新关系表视图
PS。以防万一是重要的,我在网络上运行一个MySql
服务器。
#include "xtest.h"
#include "ui_xtest.h"
XTest::XTest(QWidget *parent) : QDialog(parent), ui(new Ui::XTest)
{
ui->setupUi(this);
modelSuppliers=new QSqlRelationalTableModel(this);
modelSuppliers->setTable("supplier");
modelSuppliers->setEditStrategy(QSqlTableModel::OnManualSubmit);
modelSuppliers->setHeaderData(0,Qt::Horizontal,"ID");
modelSuppliers->setHeaderData(1,Qt::Horizontal,"Name");
modelSuppliers->setHeaderData(2,Qt::Horizontal,"Address");
modelSuppliers->setHeaderData(3,Qt::Horizontal,"Address1");
modelSuppliers->setHeaderData(4,Qt::Horizontal,"City");
modelSuppliers->setHeaderData(5,Qt::Horizontal,"User");
modelSuppliers->setHeaderData(6,Qt::Horizontal,"Country");
modelSuppliers->setHeaderData(7,Qt::Horizontal,"Sta/Reg");
modelSuppliers->setHeaderData(8,Qt::Horizontal,"Active");
// modelSuppliers->setRelation(5,QSqlRelation("user","iduser","email"));
// modelSuppliers->setRelation(6,QSqlRelation("country","idcountry","name"));
// modelSuppliers->setRelation(7,QSqlRelation("sta_reg","idsta_reg","name"));
modelSuppliers->select();
ui->suppliers->setModel(modelSuppliers);
ui->suppliers->resizeColumnsToContents();
ui->suppliers->resizeRowsToContents();
ui->suppliers->setItemDelegate(new QSqlRelationalDelegate(ui->suppliers));
ui->suppliers->show();
}
XTest::~XTest()
{
delete ui;
}
void XTest::on_save_clicked()
{
modelSuppliers->submitAll();
}
我一直在玩这一段时间,我发现了一些可能相关的东西。我将模型更新之前的信号连接到一个显示行和QSqlRecord的函数。我做了两次关系“用户”激活的运行,另一次没有激活。在第5行,在我看来,模型试图用相关表的描述来更新记录,而不是用密钥。第二轮,更新的那个,在那个位置上有关键。这是QT的错误吗?
2
QSqlRecord(9)
0: QSqlField("idsupplier", int, length: 11, precision: 0, required: yes, generated: no, typeID: 3, autoValue: true, readOnly: false) "4"
1: QSqlField("name", QString, length: 180, precision: 0, required: no, generated: no, typeID: 253, autoValue: false, readOnly: false) "Other"
2: QSqlField("address", QString, length: 180, precision: 0, required: no, generated: no, typeID: 253, autoValue: false, readOnly: false) "Direccion"
3: QSqlField("address1", QString, length: 180, precision: 0, required: no, generated: yes, typeID: 253, autoValue: false, readOnly: false) "dddd"
4: QSqlField("city", QString, length: 180, precision: 0, required: no, generated: no, typeID: 253, autoValue: false, readOnly: false) "Santiago"
5: QSqlField("iduser", int, length: 11, precision: 0, required: yes, generated: no, typeID: 3, autoValue: false, readOnly: false) "N/A"
6: QSqlField("idcountry", int, length: 11, precision: 0, required: yes, generated: no, typeID: 3, autoValue: false, readOnly: false) "2"
7: QSqlField("idsta_reg", int, length: 11, precision: 0, required: yes, generated: no, typeID: 3, autoValue: false, readOnly: false) "5"
8: QSqlField("active", char, length: 4, precision: 0, required: no, generated: no, typeID: 1, autoValue: false, readOnly: false) "1"
""
.
2
QSqlRecord(9)
0: QSqlField("idsupplier", int, length: 11, precision: 0, required: yes, generated: no, typeID: 3, autoValue: true, readOnly: false) "4"
1: QSqlField("name", QString, length: 180, precision: 0, required: no, generated: no, typeID: 253, autoValue: false, readOnly: false) "Other"
2: QSqlField("address", QString, length: 180, precision: 0, required: no, generated: no, typeID: 253, autoValue: false, readOnly: false) "Direccion"
3: QSqlField("address1", QString, length: 180, precision: 0, required: no, generated: yes, typeID: 253, autoValue: false, readOnly: false) "dddd"
4: QSqlField("city", QString, length: 180, precision: 0, required: no, generated: no, typeID: 253, autoValue: false, readOnly: false) "Santiago"
5: QSqlField("iduser", int, length: 11, precision: 0, required: yes, generated: no, typeID: 3, autoValue: false, readOnly: false) "1"
6: QSqlField("idcountry", int, length: 11, precision: 0, required: yes, generated: no, typeID: 3, autoValue: false, readOnly: false) "2"
7: QSqlField("idsta_reg", int, length: 11, precision: 0, required: yes, generated: no, typeID: 3, autoValue: false, readOnly: false) "5"
8: QSqlField("active", char, length: 4, precision: 0, required: no, generated: no, typeID: 1, autoValue: false, readOnly: false) "1"
显示的.ui文件是没有必要的,在OP在谈论如何与QSqlRelationalTableModel做到这一点,利用QSqlQuery是这样做的一个老式的方法,因为它需要上千行的,而不是几十个,如果你正确使用QSqlRelationalTableModel。 – eyllanesc
请阅读以下内容以改进您的答案。 [我如何写出一个好的答案?](https://stackoverflow.com/help/how-to-answer) – eyllanesc
数据库是使用模型工具直接在MySql上创建的。'supplier',它只有一个主键有3个外键链接到OP中注释掉的表。 – Dan3460