Как написать оператор if, сравнивающий числа, который условно создает объекты в QML - PullRequest
1 голос
/ 19 июня 2020

Я работаю с QML и Python3 .6 + PySide2, и я пытаюсь написать сценарий на QML, который берет два целых числа из соединения в python и сравнивает их, чтобы решить, какой фон изображения использовать для окно.

Есть несколько вещей, с которыми я борюсь. Во-первых, я не уверен, как сравнивать мои числовые c (закат и восход солнца) переменные. Во-вторых, я не знаю, как написать часть в стиле оператора if, которая условно создает фоновое изображение. В-третьих, я не думаю, что лучше делать это в разделе «Подключения» и, возможно, даже в моем QML, но я не уверен, как переместить свои переменные в другое место.

Я очень ценю любые указатели или помощь !!

Данные, из которых я рисую, выглядят так: «восход»: 1592565499, «закат»: 1592617094

QML псевдо-i sh код:

Connections {
        target: weather
        function onDataChanged(){
            if(!weather.hasError()){
                var sunrise = weather.data['dt']['sunrise']
                var sunset = weather.data['dt']['sunset']
                if (sunrise <= sunset)
                    Image {
                      source: "night.png"}
                else 
                    Image {
                      course: "day.png"}
}

1 Ответ

1 голос
/ 19 июня 2020

Вы не можете создавать QML-элементы из таких операторов if (как и из State). Вы можете позвонить по номеру Qt.createComponent, если хотите, однако в данном примере это слишком много. Вы должны напрямую установить свойство source вашего изображения:

Image {
   id: image_tod
}

Connections {
   target: weather
   function onDataChanged(){
      if(!weather.hasError()){
         var sunrise = weather.data['dt']['sunrise']
         var sunset = weather.data['dt']['sunset']
         if (sunrise <= sunset)
            image_tod.source = "night.png"
         else 
               image_tod.source = "day.png"
      }
   }
}

Глядя на код, вы действительно можете привязать его непосредственно к свойству source (не знаете, как именно выглядит ваша модель. как):

 Image {
     source: {
         if(weather.data['dt']['sunrise'] <= weather.data['dt']['sunset'])
             return "night.png"
         else
             return "day.png"
     }
 }

Это работает, потому что при компиляции QML движок создает зависимость от каждой ссылочной переменной (weather и data в данном случае) и повторно оценивает всю привязку, если любой из них сигнализирует об изменении. Чтобы в полной мере использовать это, вы должны также предоставить hasError как свойство, а не функцию (и излучать каждый раз, когда оно изменяется).

Последующее обновление

Да, вы можете сделать это настолько безумным, насколько захотите. Я думаю, вы имеете в виду это:

 Image {
     source: {
         if(weather.data['dt']['sunrise'] <= weather.data['dt']['sunset'])
             return "night.png"
         else if(weather.data['dt']['sunrise'] > weather.data['dt']['sunset'])
             return "day.png"
         else
             return "" //means no image
     }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...