我试图从QSqlQueryModel中删除一行,如下所示:
void MainWindow::deleteRecord()
{
int row_index= ui->tableView->currentIndex().row();
model->removeRow(row_index);
}
但它没有用。
我也尝试了以下内容:
void MainWindow::deleteRecord()
{
int row_index= ui->tableView->currentIndex().row();
if(!db_manager->delete_record(QString::number(row_no))){
ui->appStatus->setText("Error: data deletion ...");
} else{
ui->appStatus->setText("Record deleted ...");
}
}
在db_manager中,函数delete_recod(QString row_no)是:
bool DatabaseManager::delete_record(QString row_index)
{
QSqlQuery query;
query.prepare("DELETE FROM personal_Info WHERE ref_no = (:ref_no)");
query.bindValue(":ref_no",row_index);
if (!query.exec())
{
qDebug() << "Error" << query.lastError().text();
return false;
}
return true;
}
但也不行。在两次尝试中,应用程序都不会崩溃,也不会出现SQLite错误。
我做错了什么,如何解决?
答案 0 :(得分:1)
第一种方法失败,因为QSqlQueryModel
没有实现removeRows
。你没有检查它的返回值(坏!坏!坏!),这是{ {1}},意思是失败。
它怎么可能实现行删除功能?您的SQL查询可以是任何字面上的任何内容,包括删除行没有任何意义的结果集。
相反,请考虑使用false
- 它可能不适用于您的案例,但考虑到您的QSqlTableModel
声明的形式,我会这样说。 (DELETE
仅显示一个表/视图的对象。)
第二种方法可能已经开始工作了。您没有看到UI更新的事实并不意味着什么 - 您应该检查实际的数据库内容以查看{{ 1}}语句实际上工作并删除了一些东西。
现在请注意,数据库没有任何内容告诉Qt更新其视图。您需要设置该基础架构。现代数据库支持触发器和信令系统(由QSqlTableModel
包装在Qt中),可用于此目的。在其他情况下,您可以手动触发SQL模型的刷新,例如通过调用DELETE
。