14 августа 2019 г. 3: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

Добрый день.

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

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

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)
    }
}

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

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

Сделал так, но все равно в синий не красит, в 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)

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

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

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";
}
                    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.
Скажите пожалуйста, как это учесть и сделать так, что-бы это было равно?

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

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

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

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

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

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

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

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

Комментарии

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

Здравствуйте, уважаемые пользователи EVILEG !!!

Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.

Вы можете сделать это следующими способами:

Спасибо, Евгений Легоцкой

AS
13 декабря 2019 г. 6:05
Aruzhan Seraliyeva

C++ - Тест 003. Условия и циклы

  • Результат:50баллов,
  • Очки рейтинга-4
AS
13 декабря 2019 г. 5:47
Aruzhan Seraliyeva

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

  • Результат:40баллов,
  • Очки рейтинга-8
Т
11 декабря 2019 г. 16:56
Тома

C++ - Тест 003. Условия и циклы

  • Результат:50баллов,
  • Очки рейтинга-4
Последние комментарии
9 декабря 2019 г. 3:41
Евгений Легоцкой

Эта ошибка invalid use of incomplete type ‘class Ui::AnotherWindow’ обычно говорит о том, что не найдено определение класса или структуры. Типичная проблема - не подключён заголовочны…
НБ
9 декабря 2019 г. 3:36
Николай Батманов

Ну, не настолько со мной всё полхо...))) Вроде бы. Я ж кнопки отрисовываю.
9 декабря 2019 г. 3:14
Евгений Легоцкой

Добрый день. У вас ui файлов по ходу нет. UI файлы используются для вёрстки в графическом дизайнере.
НБ
9 декабря 2019 г. 3:05
Николай Батманов

Здравствуйте! Полностью скопировал ваш пример к себе, чтобы разобраться. А он не хочет запускаться, дает ошибку: invalid use of incomplete type ‘class Ui::AnotherWindow’ ui(new Ui…
8 декабря 2019 г. 7:23
Евгений Легоцкой

У меня здесь есть одна старая статья с примером векторного редактора. Там есть ответы на ваши вопросы. Поизучайте Qt/C++ - Урок 072. Пример векторного редактора на Qt QGraphicsItem, QG…
Сейчас обсуждают на форуме
t
13 декабря 2019 г. 17:17
tantrido

Всё работает, при чём тут колхоз?! ;) https://doc.qt.io/qt-5/qtqml-cppintegration-data.html Если что-то не работает - вопрос к собственным рукам и знаниям. Вопрос не корректен - мож…
13 декабря 2019 г. 10:16
Руслан Волшебник

Да, я посмотрел, вы абсолютно правы. Единственное, если я правильно понял, если срабатывает условие if (aggregates["max_id"] - aggregates["min_id"]) + 1 == aggregates["count"]: return sel…
t
13 декабря 2019 г. 9:53
tantrido

Ответ >>
13 декабря 2019 г. 8:39
Александр Панюшкин

Вроде да. Только там начинаются вопросы с тем, чтобы виджет бы в фокусе, чтобы до виджета это событие долетало.
ДК
13 декабря 2019 г. 7:48
Джон Кофи

Привет. Есть класс "ждун", который используется на разных виджетах: class WaiterDialog;#define WAITER_DIALOG Singleton<WaiterDialog>::instance()class WaiterDialog : public QObject, …
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB