Сохранение элементов QtQuick с несколькими состояниями в файлы .png - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь сохранить визуальные элементы, имеющие несколько состояний, в виде изображений .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функция вызывается дважды, как и ожидалось, но только после всех изменений состояния, поэтому я получаю только одно изображение, показывающее последнее состояние и перезаписывающее первое изображение.Если я использую разные имена файлов для предотвращения перезаписи, я получаю два изображения, каждое из которых показывает конечное состояние.

Как сохранить соответствующее изображение для каждого состояния элемента?

1 Ответ

0 голосов
/ 30 декабря 2018

У вас есть 2 ошибки:

  • Вы изменяете свой статус, не убедившись, что вы уже сохранили изображение.

  • При выполнении вышеизложенного значение состояния будет обновлено в grabToImage и будет указывать на предыдущее состояние.

В обоих случаяхРешение заключается в том, чтобы убедиться, что изображение было сохранено для изменения состояния.Учитывая вышеизложенное, решение выглядит следующим образом:

*. Py

from PySide2 import QtCore, QtGui, QtQuick

if __name__ == '__main__':
    import sys
    app = QtGui.QGuiApplication(sys.argv)
    view = QtQuick.QQuickView()
    view.setSource(QtCore.QUrl('grab_states.qml'))
    view.show()
    rect = view.rootObject()
    rect.setProperty("currentIndex", 0)
    sys.exit(app.exec_())

*. Qml

import QtQuick 2.0

Rectangle {
    id: rect
    width: 100
    height: 100
    color: "black"
    property int currentIndex: -1
    onCurrentIndexChanged: if(currentIndex >= 0 && currentIndex < states.length) state = states[currentIndex].name
    states: [
        State {name: "off"; PropertyChanges{target: rect; color: "red"}},
        State {name: "on";  PropertyChanges{target: rect; color: "green"}}
    ]

    onStateChanged: {
        rect.grabToImage(function(result){
            result.saveToFile(state + ".png");
            currentIndex+= 1;
            console.log(filename);
        })
    }
}
...