我试图让 QTableView 表现得像一个网格表,即底部总是有一个空行,用户输入要插入的新记录。想想 MS Access 子表单,或者在 web 开发中,我认为我们称之为内联编辑。
我正在使用 Qt 4.7.4,非常标准的代码:
model = new QSqlTableModel(this);
model->setTable("order_details");
models->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->setFilter(QString("parent_id = '%1'").arg(ID->toString());
model->select();
model->insertRow(model->rowCount()); //worked womehow
//QSqlRecord rec = model->record();
//rec.setValue("fieldName", var); //useful for initializing some fields
//model->insertRecord(-1, rec); //internally call insertRow(rowCount()) then setRecord
ui->tblGrid->setModel(model);
如果将 insertRow 或 insertRecord 放入构造函数中,则不会发生任何事情。没有添加行。但是,如果我创建一个调用其中任何一个的按钮,则会添加一个新行,但它是uneditable。
要观察这一点,请尝试修改Qt 的缓存表示例,如果放入构造函数中,添加 insertRow() 将无济于事。但是,在从按钮调用的插槽中,它将很好地添加行。不可编辑,当然。
所以我的问题是:
- 为什么会这样?我已经看够了 QSqlTableModel 的源代码,但要理解它,我们还需要了解 QSqlRecord、QSqlQuery、QAbstractItemModel 等......我无法理解它。
- 为了解决不可编辑的行,我将 QSqlTableModel 重写为 flags() 以返回 Qt::ItemIsEditable 和 Qt::ItemIsenabled 无济于事。我做错了什么?
- 我知道我最终将继承 QTableView 以获得这种行为,所以如果有人对我有一些指示,我将不胜感激,也许我可以阅读一些项目的源代码。
谢谢,
埃文