2017-04-13 148 views
0

我创建了一个应用程序,它具有在QTableView中显示数据库搜索的SQLite数据库访问。搜索正在查找所有列。现在我想能够编辑单元格并保存到数据库中。我似乎可以编辑单元格,但数据不会保存。使用QT和SQLite更新数据库的单元格编辑

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。根据文档和小时的Google搜索,看起来好像QTableView应该在编辑单元格时相应地更新数据库。我肯定错过了什么。

起初,我认为这可能是由没有主键的数据库引起的,但两种情况的情况都是一样的。

回答

1

我找到了解决我的问题的方法。我缺少的东西是setFilter()和正确的查询。

QSqlTableModel作为反对QSqlQueryModelsetQuery()我们应该用setFilter()这是SQL查询的WHERE一部分,setTable()这是"Select * FROM tablename"。现在通过QTableView来编辑表格,我们所要做的就是使用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); 
} 

我希望有人会觉得它有用。