Представление не перерисовывается после обновления 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() после моего запроса, без результатов. Что мне нужно сделать, чтобы я сразу получил новые записи в представлении? Благодарю.

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);
}

Как сказано в документации:

Вставляет запись в строку позиции. Если строка отрицательна, запись будет добавлена ​​в конец. Вызывает insertRows() и setRecord() внутри. Возвращает true, если запись может быть вставлена, иначе false. Изменения отправляются немедленно для OnFieldChange и OnRowChange. Отказ не оставляет новый ряд в модели.

Это должно сделать все возможное, чтобы обновить базу данных, а также модель.

Согласно документации от QMLifyProxyModel говорится, что он еще не поддерживает обновление модели при изменениях исходной модели. Итак, если вы используете QMLifyProxyModel для перехода от QSqlTableModel к QML ListView, то, вероятно, это причина, по которой ваш вид не обновляется.

Другие вопросы по тегам