0

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() 方法的“添加”按钮,我将看不到结果。视图不会重绘。还有一个从 QAbstractProxyModel 继承的代理QMLifyProxyModel但我不认为这是问题所在。当我重新启动应用程序时,我可以看到数据库中的更改。似乎模型在更新后没有读取数据。

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

4

2 回答 2

2

是的,我知道这是一个老问题,但我会为以后可能需要它的任何人提供答案。

据我从代码中可以看出,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);
}

正如文档所说

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

这应该可以更新数据库和模型。

于 2013-09-09T13:13:05.590 回答
0

根据QMLifyProxyModel的文档,它说它还不支持在更改源模型时更新模型。因此,如果您使用 QMLifyProxyModel 从 QSqlTableModel 转换到 QML ListView 可能这就是您的视图未刷新的原因。

于 2011-07-24T12:05:33.570 回答