Михаиллл
Михаиллл14 серпня 2019 р. 03:27

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

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

 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"
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

10
Evgenii Legotckoi
  • 14 серпня 2019 р. 03:35
  • (відредаговано)

Добрый день.

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

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

delegate: Item {
    Text {
        anchors.fill: parent

        function getColor(date) {
            if (date >= Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy") && date <= Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr2(), "dd.MM.yyyy"))
            {
                return "blue";
            }
            else if (date ===  Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy"))
            {
                return "gainsboro";
            }
            return "white";
        }

        color: getColor(model.date)
    }
}

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

    Evgenii Legotckoi
    • 14 серпня 2019 р. 03:42

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

      Михаиллл
      • 14 серпня 2019 р. 04:15

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

                      function getColor(date) {
                          if (date > Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy") && date < Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr2(), "dd.MM.yyyy"))
                          {
                              return "gainsboro";
                          }
                          else if (date ===  Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy"))
                          {
                              return "blue";
                          }
                          return "white";
                      }
                      color: getColor(model.date)
      
        Evgenii Legotckoi
        • 14 серпня 2019 р. 04:23
        • (відредаговано)

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

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

        function getColor(date) {
            console.log(date,  Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy"));
            if (date > Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy") && date < Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr2(), "dd.MM.yyyy"))
            {
              return "gainsboro";
            }
            else if (date ===  Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy"))
            {
              return "blue";
            }
            return "white";
        }
        
          Михаиллл
          • 14 серпня 2019 р. 07:11
                              console.log( model.date )
                              console.log(Date.fromLocaleString(Qt.locale(), AppCore.getDateOypr1(), "dd.MM.yyyy"));
          

          возвращает:

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

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

            Михаиллл
            • 14 серпня 2019 р. 07:34

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

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

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

              Михаиллл
              • 14 серпня 2019 р. 07:41

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

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

              хотя

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

              возврощают

              qml: 15.08.2019
              qml: 15.08.2019
              
                Evgenii Legotckoi
                • 14 серпня 2019 р. 07:43
                • Відповідь була позначена як рішення.

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

                  Михаиллл
                  • 14 серпня 2019 р. 08:18

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

                    Evgenii Legotckoi
                    • 14 серпня 2019 р. 08:20

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

                      Коментарі

                      Only authorized users can post comments.
                      Please, Log in or Sign up
                      sf

                      C++ - Тест 004. Указатели, Массивы и Циклы

                      • Результат:90бали,
                      • Рейтинг балів8
                      МВ

                      Qt - Тест 001. Сигналы и слоты

                      • Результат:68бали,
                      • Рейтинг балів-1
                      ЛС

                      C++ - Тест 001. Первая программа и типы данных

                      • Результат:53бали,
                      • Рейтинг балів-4
                      Останні коментарі
                      A
                      ALO1ZE19 жовтня 2024 р. 08:19
                      Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                      ИМ
                      Игорь Максимов05 жовтня 2024 р. 07:51
                      Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                      d
                      dblas505 липня 2024 р. 11:02
                      QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                      k
                      kmssr08 лютого 2024 р. 18:43
                      Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                      АК
                      Анатолий Кононенко05 лютого 2024 р. 01:50
                      Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                      Тепер обговоріть на форумі
                      J
                      JacobFib17 жовтня 2024 р. 03:27
                      добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                      ИМ
                      Игорь Максимов03 жовтня 2024 р. 04:05
                      Реализация навигации по разделам Спасибо Евгений!
                      JW
                      Jhon Wick01 жовтня 2024 р. 15:52
                      Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                      КГ
                      Кирилл Гусарев27 вересня 2024 р. 09:09
                      Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                      F
                      Fynjy22 липня 2024 р. 04:15
                      при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                      Слідкуйте за нами в соціальних мережах