Михаиллл
Aug. 14, 2019, 1:27 p.m.

Как в 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

Do you like it? Share on social networks!

10
Evgenii Legotckoi
  • Aug. 14, 2019, 1:35 p.m.
  • (edited)

Добрый день.

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

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

  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
    • Aug. 14, 2019, 1:42 p.m.

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

      Михаиллл
      • Aug. 14, 2019, 2:15 p.m.

      Сделал так, но все равно в синий не красит, в 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
        • Aug. 14, 2019, 2:23 p.m.
        • (edited)

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

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

        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. }
          Михаиллл
          • Aug. 14, 2019, 5:11 p.m.
          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.
          Скажите пожалуйста, как это учесть и сделать так, что-бы это было равно?

            Михаиллл
            • Aug. 14, 2019, 5:34 p.m.

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

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

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

              Михаиллл
              • Aug. 14, 2019, 5:41 p.m.

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

              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
                • Aug. 14, 2019, 5:43 p.m.
                • The answer was marked as a solution.

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

                  Михаиллл
                  • Aug. 14, 2019, 6:18 p.m.

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

                    Evgenii Legotckoi
                    • Aug. 14, 2019, 6:20 p.m.

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

                      Comments

                      Only authorized users can post comments.
                      Please, Log in or Sign up
                      • Last comments
                      • AK
                        April 1, 2025, 11:41 a.m.
                        Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                      • Evgenii Legotckoi
                        March 9, 2025, 9:02 p.m.
                        К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                      • VP
                        March 9, 2025, 4:14 p.m.
                        Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                      • ИМ
                        Nov. 22, 2024, 9:51 p.m.
                        Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                      • Evgenii Legotckoi
                        Oct. 31, 2024, 11:37 p.m.
                        Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup