Я пытаюсь сохранить визуальные элементы, имеющие несколько состояний, в виде изображений .png (по одному png для каждого состояния)
Я вызываю метод grabToImage () элемента в обработчике сигнала onStateChanged, но изображениясохраняется только после последнего изменения состояния, создавая только одно изображение, соответствующее последнему установленному состоянию элемента.
Я также попытался вызвать saveToFile () на стороне Python, но это привело к ошибке времени выполнения (см.комментарии в коде Python)
grab_states.py
from PySide2.QtCore import QUrl
from PySide2.QtWidgets import QApplication
from PySide2.QtQuick import QQuickView
app = QApplication([])
view = QQuickView()
view.setSource(QUrl('grab_states.qml'))
view.show()
rect = view.rootObject()
rect.setState('off')
rect.setState('on')
# RuntimeError: Internal C++ object (PySide2.QtQuick.QQuickItemGrabResult) already deleted.
# rect.grabToImage().data().saveToFile(rect.property('state') + ".png")
app.exec_()
grab_states.qml
import QtQuick 2.0
Rectangle {
id: rect
width: 100
height: 100
color: "black"
states: [
State {name: "off"; PropertyChanges{target: rect; color: "red"}},
State {name: "on"; PropertyChanges{target: rect; color: "green"}}
]
onStateChanged: {
print('stateChaged: ' + state)
rect.grabToImage(function(result){
print("saveToFile: " + rect.state);
result.saveToFile(state + '.png');
}
)
}
}
SaveToFileфункция вызывается дважды, как и ожидалось, но только после всех изменений состояния, поэтому я получаю только одно изображение, показывающее последнее состояние и перезаписывающее первое изображение.Если я использую разные имена файлов для предотвращения перезаписи, я получаю два изображения, каждое из которых показывает конечное состояние.
Как сохранить соответствующее изображение для каждого состояния элемента?