Представление не перерисовывается после обновления QSqlTableModel - PullRequest
0 голосов
/ 16 апреля 2011

Существует подкласс 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 ]

1 голос
/ 09 сентября 2013

Да, я знаю, что это старый вопрос, но я дам ответ на любой вопрос, который может понадобиться позже.

Насколько я вижу из кода, 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.Ошибка не оставляет новую строку в модели.

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

0 голосов
/ 24 июля 2011

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

...