使用 QT 和 SQLite 通过单元格编辑更新数据库
Update the database with cell edit using QT and SQLite
我正在创建一个具有 SQLite 数据库访问权限的应用程序,它在 QTableView 中显示数据库搜索。搜索正在查找所有列。现在我希望能够编辑单元格并保存到数据库中。我似乎能够编辑单元格,但数据未保存。
void MainWindow::on_search_box_textChanged(const QString &arg1)
{
QSqlQueryModel *GetTable = new QSqlTableModel(ui->tableView);
if(!arg1.isEmpty())
{
GetTable->setQuery(QString("SELECT * FROM Cour WHERE (Date LIKE '""%"+arg1+"%""' OR Name LIKE '""%"+arg1+"%""' OR bill LIKE '""%"+arg1+"%""' OR [B O L] LIKE '""%"+arg1+"%""' OR SO LIKE '""%"+arg1+"%""' OR ETA LIKE '""%"+arg1+"%""' OR Description LIKE '""%"+arg1+"%""' );"));
ui->tableView->setModel(GetTable);
ui->tableView->setAlternatingRowColors(GetTable);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
}
if(arg1.isEmpty())
{
GetTable->clear();
ui->tableView->clearFocus();
ui->tableView->setModel(GetTable);
}
}
这是我用来在 QTableView 中显示数据的代码。我试过在 QSqlTableModel 和 QSqlQueryModel 之间切换。根据文档和谷歌搜索时间,似乎 QTableView 应该在编辑单元格时相应地更新数据库。我一定是遗漏了什么。
一开始我以为可能是数据库没有主键导致的,但是两种情况都是一样的
我找到了解决问题的方法。我缺少的是带有正确构造的查询的 setFilter()。
在 QSqlTableModel
中,与 QSqlQueryModel
的 setQuery()
相反,我们应该使用 setFilter()
,它是 SQL 查询的 WHERE
部分setTable()
即 "Select * FROM tablename"
。现在要通过 QTableView 创建 table editable,我们所要做的就是使用 setEditStrategy()
。有几个选项可供选择,但我需要的是 setEditStrategy(QSqlTableModel::OnFieldChange)
.
void MainWindow::on_search_box_textChanged(const QString &arg1)
{
QSqlTableModel *GetTable = new QSqlTableModel(ui->tableView);
if(!arg1.isEmpty()){
GetTable->setTable("DHL");
GetTable->setEditStrategy(QSqlTableModel::OnFieldChange);
GetTable->setFilter(QString("Date LIKE '""%"+arg1+"%""' OR Name LIKE '""%"+arg1+"%""' OR bill LIKE '""%"+arg1+"%""' OR [B O L] LIKE '""%"+arg1+"%""' OR SO LIKE '""%"+arg1+"%""' OR ETA LIKE '""%"+arg1+"%""' OR Description LIKE '""%"+arg1+"%""';"));
GetTable->select();
QTableView *tableview = new QTableView();
ui->tableView->setModel(GetTable);
ui->tableView->hideColumn(7); // don't show the ID
ui->tableView->setAlternatingRowColors(GetTable);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tableView->show();
}
else
{
GetTable->clear();
ui->tableView->clearFocus();
ui->tableView->setModel(GetTable);
}
我希望有人会发现它有用。
我正在创建一个具有 SQLite 数据库访问权限的应用程序,它在 QTableView 中显示数据库搜索。搜索正在查找所有列。现在我希望能够编辑单元格并保存到数据库中。我似乎能够编辑单元格,但数据未保存。
void MainWindow::on_search_box_textChanged(const QString &arg1)
{
QSqlQueryModel *GetTable = new QSqlTableModel(ui->tableView);
if(!arg1.isEmpty())
{
GetTable->setQuery(QString("SELECT * FROM Cour WHERE (Date LIKE '""%"+arg1+"%""' OR Name LIKE '""%"+arg1+"%""' OR bill LIKE '""%"+arg1+"%""' OR [B O L] LIKE '""%"+arg1+"%""' OR SO LIKE '""%"+arg1+"%""' OR ETA LIKE '""%"+arg1+"%""' OR Description LIKE '""%"+arg1+"%""' );"));
ui->tableView->setModel(GetTable);
ui->tableView->setAlternatingRowColors(GetTable);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
}
if(arg1.isEmpty())
{
GetTable->clear();
ui->tableView->clearFocus();
ui->tableView->setModel(GetTable);
}
}
这是我用来在 QTableView 中显示数据的代码。我试过在 QSqlTableModel 和 QSqlQueryModel 之间切换。根据文档和谷歌搜索时间,似乎 QTableView 应该在编辑单元格时相应地更新数据库。我一定是遗漏了什么。
一开始我以为可能是数据库没有主键导致的,但是两种情况都是一样的
我找到了解决问题的方法。我缺少的是带有正确构造的查询的 setFilter()。
在 QSqlTableModel
中,与 QSqlQueryModel
的 setQuery()
相反,我们应该使用 setFilter()
,它是 SQL 查询的 WHERE
部分setTable()
即 "Select * FROM tablename"
。现在要通过 QTableView 创建 table editable,我们所要做的就是使用 setEditStrategy()
。有几个选项可供选择,但我需要的是 setEditStrategy(QSqlTableModel::OnFieldChange)
.
void MainWindow::on_search_box_textChanged(const QString &arg1)
{
QSqlTableModel *GetTable = new QSqlTableModel(ui->tableView);
if(!arg1.isEmpty()){
GetTable->setTable("DHL");
GetTable->setEditStrategy(QSqlTableModel::OnFieldChange);
GetTable->setFilter(QString("Date LIKE '""%"+arg1+"%""' OR Name LIKE '""%"+arg1+"%""' OR bill LIKE '""%"+arg1+"%""' OR [B O L] LIKE '""%"+arg1+"%""' OR SO LIKE '""%"+arg1+"%""' OR ETA LIKE '""%"+arg1+"%""' OR Description LIKE '""%"+arg1+"%""';"));
GetTable->select();
QTableView *tableview = new QTableView();
ui->tableView->setModel(GetTable);
ui->tableView->hideColumn(7); // don't show the ID
ui->tableView->setAlternatingRowColors(GetTable);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tableView->show();
}
else
{
GetTable->clear();
ui->tableView->clearFocus();
ui->tableView->setModel(GetTable);
}
我希望有人会发现它有用。