更新QSqlTableModel后不重绘View

时间:2011-04-16 15:30:20

标签: c++ database qt mvvm qtsql

有一个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的观点。但是,如果我点击“ADD”按钮调用addTask()方法我无法看到结果。视图未重绘。还有一个从QAbstractProxyModel继承的代理QMLifyProxyModel,但我不相信这是问题所在。 当我重新启动应用程序时,我可以看到DB中的更改。 似乎模型在更新后没有读取数据。

顺便说一下,我试图在查询后发出layoutChanged(),没有结果。 我需要做什么才能在视图中立即获得新记录? 感谢。

2 个答案:

答案 0 :(得分: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

  

在位置行插入记录。如果row为负数,则记录将附加到末尾。在内部调用insertRows()和setRecord()。   如果可以插入记录,则返回true,否则返回false。   立即为OnFieldChange和OnRowChange提交更改。失败不会在模型中留下新行。

这应该可以完成更新数据库和模型的所有魔力。

答案 1 :(得分:0)

根据QMLifyProxyModel的文档,它表示在更改源模型时它尚不支持更新模型。 因此,如果您使用QMLifyProxyModel从QSqlTableModel转换到QML ListView,那么这可能是您查看未刷新的原因。