2011-04-16 93 views
0

有一個QSqlTableModel的子類。更新後不重繪視圖QSqlTableModel

class TaskManager : public QSqlTableModel 
{ 
    Q_OBJECT 
public: 

    explicit TaskManager(QObject *parent = 0){} 
    void initMode();  
    bool addTask(Task &task); 
    ... 
} 

這是initModel()

void TaskManager::initModel() 
{ 
    setTable(currenttasks); 
    setEditStrategy(QSqlTableModel::OnFieldChange); 
    select(); 
} 

這是addTask方法

bool TaskManager::addTask(Task &task) 
{ 
    QSqlQuery query; 
    query.prepare("INSERT INTO currenttasks (description, numbers, imageid) " 
        "VALUES (:descr, :numbers, :imageid)"); 

    query.bindValue(":descr", task.description); 
    query.bindValue(":numbers", task.numbers); 
    query.bindValue(":imageid", task.imageid); 
    bool res = query.exec(); 
    reset(); 
    return res; 
} 

此外還有上QML的圖。但是,如果我點擊「添加」按鈕調用addTask()方法,我看不到結果。該視圖不會重繪。還有一個代理QMLifyProxyModel繼承自QAbstractProxyModel,但我不認爲這是問題。 我可以在重新啓動應用程序時看到數據庫中的更改。 看來,該模型更新後不讀取數據。

順便說一句,我試圖發出layoutChanged()後查詢,沒有結果。 我需要做什麼,我立即在視圖中獲得新記錄? 謝謝。

回答

0

根據來自QMLifyProxyModel的文檔,它表示它還不支持在對源模型進行更改時更新模型。 因此,如果您使用QMLifyProxyModel從QSqlTableModel轉換到QML ListView,那麼可能這就是您未查看的原因未刷新。

1

是的,我知道這是一個古老的問題,但我會在稍後提供任何可能需要的答案。

據我可以看到從代碼QSqlQuery將只會更新數據庫,而不是模型。

我會使用與QSqlTableModel的功能:

bool TaskManager::addTask(Task &task) 
{ 
    QSqlRecord record = this->record(); 
    record.setValue("description", task.description); 
    record.setValue("numbers", task.numbers); 
    record.setValue("imageid", task.imageid); 

    // -1 means append 
    return insertRecord(-1, record); 
} 

由於documentation says

在插入位置的行記錄。如果行是負數,則記錄將被追加到最後。在內部調用insertRows()和setRecord()。 如果可以插入記錄,則返回true,否則返回false。 立即爲OnFieldChange和OnRowChange提交更改。失敗不會在模型中留下新的一行。

這應該做更新數據庫以及模型的所有魔法。