Ruslan Polupan
13 февраля 2020 г. 15:16

Integer to QColor

int, QColor

Доброго времени суток!
В базе данных цета хранятся как INTEGER

Как преобразовать значение в QColor?
Чет я сломал мозг...

3

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

13
Evgenii Legotckoi
  • 13 февраля 2020 г. 16:04
  • (ред.)

Добрый день.

Сначала нужно конвертировать int в QString hex в формате понятном для QColor, а потом установить его в QColor

  1. int decimal = 826185;
  2. QString hexvalue = QString("#%1").arg(decimal, 8, 16, QLatin1Char( '0' ));
  3. QColor color;
  4. color.setNamedColor(hexvalue);
  5. qDebug() << decimal << hexvalue << color.red() << color.green() << color.blue();

Вывод этого кода будет такой

826185 "#000c9b49" 12 155 73

    Ruslan Polupan
    • 13 февраля 2020 г. 16:40

    Спасибо.
    Немного дезинформировал, приложение консольное QColor не используешь.
    Нужен #hex цвет для html шаблона.

    ЗЫ никогда бы не подумал что все так сложно с цветами :-)

      Evgenii Legotckoi
      • 13 февраля 2020 г. 16:44
      • (ред.)

      ну тогда так

      1. int decimal = 826185;
      2. QString hexvalue = QString("#%1").arg(decimal, 6, 16, QLatin1Char( '0' ));
      3. qDebug() << decimal << hexvalue;

      Выхлоп такой будет

      826185 "#0c9b49"

        Ruslan Polupan
        • 13 февраля 2020 г. 17:14

        Спасибо, это я пробовал но цвета почему то отличаются...
        лан это не критично...

          Evgenii Legotckoi
          • 13 февраля 2020 г. 17:21

          Сильно отличаются? Полагаю, что там также ещё альфа канал есть.
          Тогда попробуйте прибавить к строке 00 на конце

          1. int decimal = 826185;
          2. QString hexvalue = QString("#%1").arg(decimal, 6, 16, QLatin1Char( '0' ));
          3. hexvalue.append("00");
          4. qDebug() << decimal << hexvalue;

          Выхлоп такой будет

          826185 "#0c9b4900"

            Ruslan Polupan
            • 13 февраля 2020 г. 17:35

            Про альфа я уже начитался попробовал, стало еще хуже :-)

              Ruslan Polupan
              • 13 февраля 2020 г. 17:40
              • (ред.)

              Это без альфа, с лева то что получилось справа вроде как образец

              те у меня получается

              1. <td align=right bgColor=#00ffff>92</td>

              а в оригинале

              1. <TD align=right bgColor=#FFFF00><SMALL><B>92</B>

              проверил дальше :-)
              у меня

              1. <td align=right bgColor=#0000ff>95</td>
              1. <TD align=right bgColor=#FF0000><SMALL><B>95</B>

              в оригинале

              такое чуство что не с того конца заполняется

                Evgenii Legotckoi
                • 13 февраля 2020 г. 17:51

                Прикол. Цвета по ходу в зеркальном отображении представлены.

                Сделайте так

                1. int decimal = 826185;
                2. QString hexvalue = QString("%1").arg(decimal, 6, 16, QLatin1Char( '0' ));
                3. std::reverse(hexvalue.begin(), hexvalue.end());
                4. hexvalue = QString("#%1").arg(hexvalue);
                  Ruslan Polupan
                  • 13 февраля 2020 г. 17:59

                  уже, но осью являются 3 и4 символ

                    Ruslan Polupan
                    • 13 февраля 2020 г. 18:04

                    так что как-то так :-)

                    1. QString color = QString("%1").arg(intCol, 6, 16, QLatin1Char('0'));
                    2. QString c2 = color;
                    3. c2[0]=color[4];
                    4. c2[1]=color[5];
                    5. c2[4]=color[0];
                    6. c2[5]=color[1];
                      Evgenii Legotckoi
                      • 13 февраля 2020 г. 18:07
                      • Ответ был помечен как решение.

                      Ну тоже как вариант.

                      Или вот такое

                      1. bool splitString(const QString &str, int n, QStringList &list)
                      2. {
                      3. if (n < 1)
                      4. return false;
                      5.  
                      6. QString tmp(str);
                      7.  
                      8. list.clear();
                      9.  
                      10. while (!tmp.isEmpty()) {
                      11. list.append(tmp.left(n));
                      12. tmp.remove(0, n);
                      13. }
                      14.  
                      15. return true;
                      16. }

                      А потом так

                      1. QStringList splittedList;
                      2. splitString(hexvalue, 2, splittedList);
                      3. QString reversed = splittedList.join();
                        Ruslan Polupan
                        • 14 февраля 2020 г. 19:49

                        Нашел функцию с тарых исходниках php

                        1. function IntToColor ($v)
                        2. {
                        3. return sprintf("%02X%02X%02X",$v&0xFF,($v>>0x8)&0xFF,($v>>0x10)&0xFF);
                        4. }

                        Может кто помочь адаптировать... читать про ПХП не осилю...

                          ИП
                          • 20 февраля 2020 г. 12:24
                          • (ред.)
                          1. QSqlQuery query("SELECT CONCAT("#", LPAD(HEX(`t`.RGB), 6, 0)) FROM table AS t");
                          2. query.exec();
                          3. while (query.next())
                          4. {
                          5. QColor(query.value(0).toString());
                          6. }

                            Комментарии

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