Михаиллл
Михаиллл14. August 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

10
Evgenii Legotckoi
  • 14. August 2019 03:35
  • (bearbeitet)

Добрый день.

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

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

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. August 2019 03:42

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

      Михаиллл
      • 14. August 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. August 2019 04:23
        • (bearbeitet)

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

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

        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. August 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. August 2019 07:34

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

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

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

              Михаиллл
              • 14. August 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. August 2019 07:43
                • Die Antwort wurde als Lösung markiert.

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

                  Михаиллл
                  • 14. August 2019 08:18

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

                    Evgenii Legotckoi
                    • 14. August 2019 08:20

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

                      Kommentare

                      Nur autorisierte Benutzer können Kommentare posten.
                      Bitte Anmelden oder Registrieren
                      Letzte Kommentare
                      A
                      ALO1ZE19. Oktober 2024 08:19
                      Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                      ИМ
                      Игорь Максимов5. Oktober 2024 07:51
                      Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                      d
                      dblas55. Juli 2024 11:02
                      QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                      k
                      kmssr8. Februar 2024 18:43
                      Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                      Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                      Jetzt im Forum diskutieren
                      J
                      JacobFib17. Oktober 2024 03:27
                      добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                      JW
                      Jhon Wick1. Oktober 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. September 2024 09:09
                      Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                      F
                      Fynjy22. Juli 2024 04:15
                      при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                      Folgen Sie uns in sozialen Netzwerken