2017-04-13 76 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); 
} 

我希望有人會覺得它有用。

相關問題