Михаиллл
14 августа 2019 г. 13:27

Как в QML красить в более чем 2 цвета?

Добрый день.
У меня есть календарь.
Мне нужно красить делегаты в 4 цвета, в зависимости от условий.
В этом коде хотел сделать окрашивание в 3 цвета, но в синий не красится, в 2 других цвета красится. Скажите пожалуйста, как добится нужного результата?

  1. color: model.date >= Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy") && model.date <= Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr2(), "dd.MM.yyyy") ? model.date === Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy") ? "blue" : "gainsboro" : "white"
2

Вам это нравится? Поделитесь в социальных сетях!

10
Evgenii Legotckoi
  • 14 августа 2019 г. 13:35
  • (ред.)

Добрый день.

Ну вы явно накосячили с записью условного выражения. Лучше перепишите это на использование функции. Я как бы за использования условных выражений. Но всё хорошо в меру, у вас например явно уже достаточно нечитаемая запись.

Насколько помню, у вас там делегат. Думаю, что можно записать так.

  1. delegate: Item {
  2. Text {
  3. anchors.fill: parent
  4.  
  5. function getColor(date) {
  6. if (date >= Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy") && date <= Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr2(), "dd.MM.yyyy"))
  7. {
  8. return "blue";
  9. }
  10. else if (date === Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy"))
  11. {
  12. return "gainsboro";
  13. }
  14. return "white";
  15. }
  16.  
  17. color: getColor(model.date)
  18. }
  19. }

Заметьте, я написал код полностью с делегатом, чтобы было понятнее, что и куда писать. Обратите на это внимание.

    Evgenii Legotckoi
    • 14 августа 2019 г. 13:42

    Немного поправил код

      Михаиллл
      • 14 августа 2019 г. 14:15

      Сделал так, но все равно в синий не красит, в 2 других цвета красит. В первом уловие Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy") срабатывает как нужно, а во 2 Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy") почему-то не срабатывает.

      1. function getColor(date) {
      2. if (date > Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy") && date < Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr2(), "dd.MM.yyyy"))
      3. {
      4. return "gainsboro";
      5. }
      6. else if (date === Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy"))
      7. {
      8. return "blue";
      9. }
      10. return "white";
      11. }
      12. color: getColor(model.date)
        Evgenii Legotckoi
        • 14 августа 2019 г. 14:23
        • (ред.)

        Сравните, что вообще возвращается в обоих вариантах, к тому же оператор === отличается от оператора ==

        Оператор === также сравнивает возвращаемые типы данных. Вполне возможно, что типы данных не совпадают.

        1. function getColor(date) {
        2. console.log(date, Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy"));
        3. if (date > Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy") && date < Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr2(), "dd.MM.yyyy"))
        4. {
        5. return "gainsboro";
        6. }
        7. else if (date === Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy"))
        8. {
        9. return "blue";
        10. }
        11. return "white";
        12. }
          Михаиллл
          • 14 августа 2019 г. 17:11
          1. console.log( model.date )
          2. console.log(Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy"));

          возвращает:

          1. Invalid parameter passed to C runtime function.
          2. qml: Чт авг 15 03:00:00 2019 GMT+0300
          3. Invalid parameter passed to C runtime function.
          4. qml: Чт авг 15 00:00:00 2019 GMT+0300

          похоже разница в 03:00:00 и 00:00:00.
          Скажите пожалуйста, как это учесть и сделать так, что-бы это было равно?

            Михаиллл
            • 14 августа 2019 г. 17:34

            Попробовал сделать так, но тоже нет результата

            1. else if (model.day == Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy").getDate())/

            Хотя значения получаются одинаковые

              Михаиллл
              • 14 августа 2019 г. 17:41

              И такой вариант почему то не работает

              1. else if (Qt.formatDate(model.date,"dd.MM.yyyy") === AppCore.getDateOypr1())

              хотя

              1. console.log(Qt.formatDate(model.date,"dd.MM.yyyy"))
              2. console.log(AppCore.getDateOypr1());

              возврощают

              1. qml: 15.08.2019
              2. qml: 15.08.2019
                Evgenii Legotckoi
                • 14 августа 2019 г. 17:43
                • Ответ был помечен как решение.

                Знаете, мне приходит на ум, что лучше сделать в AppCore какой-то метод, который будет принимать передаваемую дату и C++ части делать все необходимые проверки, а на выходе будет взвращать QString с нужным вам цветом. Там просто будет более контролируемое преобразование, которое будет проще привести к гарантированному результату.

                  Михаиллл
                  • 14 августа 2019 г. 18:18

                  Переделал в c++, заработало. Странные баги в QML

                    Evgenii Legotckoi
                    • 14 августа 2019 г. 18:20

                    Да это не столько баги QML, сколько поведение JavaScript, который используется в нём. Из-за отсутствия строгой типизации получаем некоторые проблемы с преобразованием типов. в итоге, на первый взгляд всё правильно, а типы данных не совпадают, в итоге не работает. Та ещё головная боль.

                      Комментарии

                      Только авторизованные пользователи могут публиковать комментарии.
                      Пожалуйста, авторизуйтесь или зарегистрируйтесь