Представление не перерисовывается после обновления 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, то, вероятно, это причина, по которой ваш вид не обновляется.