Судя по всему, стандартные средства QML не позволяют просто взять и запросить перерисовку заданного объекта. Понятно, что объекты автоматчески перерисовываются при измении их свойств, списки автоматически перерисовываются при изменении привязанных к ним моделей. Но если есть какой-нибудь кастомный элемент интерфейса на основе, например, Rectangle, отрисовка которого зависит от какой-нибудь кастомной модели, проброшенной в QML из С++ кода, все это не поможет. Модель меняется, а вот метода, который бы заставил интерфейс перерисоваться заново с учетом этих изменений, я не нашел.
Единственное решение, которое я нашел, это удалить элемент и пересоздать его заново после изменения модели (как это делать, описано здесь). Правда, статически созданные элементы не рекомендуется удалять динамически, поэтому элементы, которые нужно будет пересоздавать, нужно сразу создавать динамически.
Если взять пример кода из моего предыдущего поста и представить, что нам нужно обновлять упомянутый там canvas (который на самом деле является элементом Rectangle), то код получится примерно следующим:
Единственное решение, которое я нашел, это удалить элемент и пересоздать его заново после изменения модели (как это делать, описано здесь). Правда, статически созданные элементы не рекомендуется удалять динамически, поэтому элементы, которые нужно будет пересоздавать, нужно сразу создавать динамически.
Если взять пример кода из моего предыдущего поста и представить, что нам нужно обновлять упомянутый там canvas (который на самом деле является элементом Rectangle), то код получится примерно следующим:
import QtQuick 2.0
ApplicationWindow {
visible: true
id: rootWindow
width: 640
height: 480
title: qsTr("Demo")
Flickable {
id: flickableContainer
anchors.fill: parent
contentWidth: canvasContainer.width
contentHeight: canvasContainer.height
property var canvas: createCanvas();
//Дополнительный контейнер
Item {
id: canvasContainer
width: canvas.width * canvas.scale
height: canvas.height * canvas.scale
}
function createCanvas() {
//Весь код canvas был перенесен в отдеьный файл CustomCanvas.qml
var canvasComponent = Qt.createComponent("CustomCanvas.qml");
var canvasObject = canvasComponent.createObject(canvasContainer);
if (canvasObject === null) {
console.log("Error creating canvas");
}
return canvasObject;
}
function updateCanvas() {
var tmp = canvas;
canvas = createCanvas();
tmp.destroy();
}
}
}
Теперь после изменения данных, на основе которых строится canvas достаточно вызвать функцию: flickableContainer.updateCanvas().
Canvas::requastPaint() ?
ОтветитьУдалить