2

我有一个QSqlTableModel并且我想在子窗口中使用特殊形式在其中插入和更新记录。不允许我故意禁用的“内联编辑”是一种设计选择。

当用户选择一个条目(可以通过 a 进行排序和过滤,QSortFilterProxyModel并通过 a 呈现QTableView)时,他有三个选项(由按钮表示):删除、编辑和添加。

我的问题是编辑:

  1. parent-widget 发出带有给定记录的信号并执行模型子视图
  2. child-widget 根据记录准备一个表单,等待用户输入,验证它,创建一个记录并将其发送回 parent-widget。
  3. parent-widget 获取记录并将其放入数据库。

问题就在这里!可以很容易地逐行获得正确的记录,如下所示:

void Parent::on_button_edit_record_clicked()
{
    // Table could be sorted/filtered!
    row = proxyModel->mapToSource(ui->tableView->currentIndex()).row();
    QSqlRecord r = model->record(row);

    emit editRecordSignal(record);
    child->exec();
}

void Parent::editRecord(const QSqlRecord &record)
{
    model->setRecord(row, record);
}

如您所见,我手动保存要更新的记录行。我不认为这是处理这个问题的好方法。实际上,这对我来说似乎很hacky。

我错过了一种将主键转换为行的简单方法,反之亦然。喜欢:

void Parent::editRecord(const QSqlRecord &record)
{
    model->setRecord(model->primaryKeyToRow(record->value("id")), record);
}

有什么方法可以轻松做到这一点(无需扩展QSqlTableModel),所以我错过了什么还是我真的需要手动保存行来实现我想要的?

4

0 回答 0