Как в программе на Qt получить из INI-файла значение, заданное в шестнадцатеричеом виде?

Модератор: Модераторы разделов

Ответить
MiK13
Сообщения: 1180
ОС: Linux Debian

Как в программе на Qt получить из INI-файла значение, заданное в шестнадцатеричеом виде?

Сообщение MiK13 »

Основная программа на Qt5. Разрабатывают другие люди. Я делаю только некоторые куски. C++ практически не использую, обхожусь чистым C.
Понадобилось задавать цвет сетки в ini-файле. Создал в файле settings.ini секцию:

Код: Выделить всё

[Grid]
color=225
В программе цвет устанавливается оператором painter->setPen(color);
Также в программе есть код, в который я добавил, по аналогии, свою строчку.

Код: Выделить всё

QVariant Settings::tryLoadValue(const QString &key, const QVariant &defaultValue) {
    if (!settings.contains(key))
        settings.setValue(key, defaultValue);
        return settings.value(key, defaultValue);
    }
}
Settings* Settings::getInstance() {
    if (instance == nullptr){
        instance = new Settings();
    }
    return instance;
}
Settings::Settings():settings("./settings/settings.ini", QSettings::IniFormat){
    settings.setIniCodec("UTF-8");
    ...
    gr_c=tryLoadValue("Grid/color",5).toUInt();                   // Взять цвет сетки.
}
Программа работает нормально. Но задавать цвет десятичным числом неудобно. Попробовал задать в виде color=0x50B0 -- получаю в результате 0. То есть число трактуется как десятичное (как буд-то используется функция atol)
А можно ли как-то сделать, чтобы значение преобразовывалось как через color=strtol(s,NULL,0) или scanf("%i",&color) ?
Спасибо сказали:
Аватара пользователя
s.xbatob
Сообщения: 1139
ОС: Fedora

Re: Как в программе на Qt получить из INI-файла значение, заданное в шестнадцатеричеом виде?

Сообщение s.xbatob »

Settings -- это что за класс? В Qt такого нет, есть QSettings. Он, правда, не предназначен для работы с конфигурациями, заполняемыми вручную, зато через него можно записать много чего разного, включая QColor
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2652
ОС: Gentoo

Re: Как в программе на Qt получить из INI-файла значение, заданное в шестнадцатеричеом виде?

Сообщение ormorph »

s.xbatob писал:
16.08.2019 20:02
Settings -- это что за класс?
Судя по выводу объявляемый класс.
color имеет тип int либо unsigned int судя по всему.
Ему нужно конвертировать строку вида 0x50B0 в int.
Похоже что так.
Только тут скорее всего придется использовать промежуточную переменную string или QString.
Тут смотреть документацию по данным классам.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3669
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Как в программе на Qt получить из INI-файла значение, заданное в шестнадцатеричеом виде?

Сообщение devilr »

Код: Выделить всё

QString str = "FF";
bool ok;
int hex = str.toInt(&ok, 16);
Так не пойдёт?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
MiK13
Сообщения: 1180
ОС: Linux Debian

Re: Как в программе на Qt получить из INI-файла значение, заданное в шестнадцатеричеом виде?

Сообщение MiK13 »

s.xbatob писал:
16.08.2019 20:02
Settings -- это что за класс? В Qt такого нет, есть QSettings.
Вполне возможно, это класс созданный разработчиком этой программы.
Я сначала подумал, что вообще можно использовать tryLoadValue, но потом увидел, что эта функция определена чуть выше.
Возможно и Settings где-то определён
Я в QtCreator смотрел список, что может быть кроме toInt и toUInt, но ничего подходящего (на мой взгляд) не увидел.
IMB писал(а):
16.08.2019 20:18
https://doc.qt.io/qt-5/qstring.html#number
Посмотрел. Но там, по-моему, number -- это наоборот, преобразование в строку. А мне нужно из строки.
Но я там нашёл

Код: Выделить всё

uint QString::toUInt(bool *ok = nullptr, int base = 10) const
В понедельник попробую, указав в качестве base 0 (по аналогии с strtol)
ormorph писал(а):
16.08.2019 20:38
color имеет тип int либо unsigned int судя по всему.
Именно unsigned int. То есть там много вариантов. Можно задать через 3 или 4 параметра RGBA. Но заводить по три переменные, а потом ещё по три строки в ini файле как-то не хочется.
ormorph писал(а):
16.08.2019 20:38
нужно конвертировать строку вида 0x50B0 в int.
Похоже что так.
Только тут скорее всего придется использовать промежуточную переменную string или QString.
У меня была такая мысль. Получить строку в s, а потом через color=strtol(s,NULL,0). Но не смог быстро сообразить, как преобразовать string (или QString) в char *.
Проблема ещё в том, что основной разработчик (который хорошо знает Qt) в отпуске.
А пока буду задавать цвет в виде десятичного числа.

devilr писал(а):
16.08.2019 20:58

Код: Выделить всё

QString str = "FF";
bool ok;
int hex = str.toInt(&ok, 16);
Так не пойдёт?
Наверно пойдёт. Проверю в понедельник. Особенно, если задать toUInt(&ok,0)
У меня была мысль, что можно в toUInt задать базу. Но qtcreator подсказал в качестве параметров toUInt только &ok.

В крайнем случае напишу свою функцию получения значения из ini-файла :)
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3669
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Как в программе на Qt получить из INI-файла значение, заданное в шестнадцатеричеом виде?

Сообщение devilr »

Ну, лисапеды в такой простой задаче строить точно не надо. :) Если в INI просто строка, то простой str.toInt(&ok, 16) вполне себе работает. Только ok надо проверять - мало ли что злобные враги в INI понапихали...
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2652
ОС: Gentoo

Re: Как в программе на Qt получить из INI-файла значение, заданное в шестнадцатеричеом виде?

Сообщение ormorph »

MiK13 писал:
17.08.2019 20:35
Но не смог быстро сообразить, как преобразовать string (или QString) в char *.
Как то так:

Код: Выделить всё

#include <QtCore>
int main() {
    QString DD="hello";
    char *TT=new char[50];
    strcpy(TT, DD.toLatin1());
    printf("%s\n", TT);
}
Вместо toLatin1 можно использовать toLocal8Bit(), либо toUtf8()
Спасибо сказали:
Аватара пользователя
s.xbatob
Сообщения: 1139
ОС: Fedora

Re: Как в программе на Qt получить из INI-файла значение, заданное в шестнадцатеричеом виде?

Сообщение s.xbatob »

Насколько я понял, Settings -- это просто обёртка над QSettings. Все параметры имеют тип QVariant, а для явно указанного формата IniFormat все они изначальна QString. Грабли в том, что в методе QVariant::toUInt() базу задать почему-то нельзя, так что придётся сначала преобразовать в QString:
value(key).toString().toUInt(nullptr, 0)
Спасибо сказали:
MiK13
Сообщения: 1180
ОС: Linux Debian

Re: Как в программе на Qt получить из INI-файла значение, заданное в шестнадцатеричеом виде?

Сообщение MiK13 »

ormorph писал(а):
17.08.2019 21:10
MiK13 писал:
17.08.2019 20:35
Но не смог быстро сообразить, как преобразовать string (или QString) в char *.
Как то так:

Код: Выделить всё

#include <QtCore>
int main() {
    QString DD="hello";
    char *TT=new char[50];
    strcpy(TT, DD.toLatin1());
    printf("%s\n", TT);
}
Вместо toLatin1 можно использовать toLocal8Bit(), либо toUtf8()
Спасибо, попробую.
s.xbatob писал:
17.08.2019 21:22
Грабли в том, что в методе QVariant::toUInt() базу задать почему-то нельзя, так что придётся сначала преобразовать в QString:
value(key).toString().toUInt(nullptr, 0)
О! Вот этот вариант, пожалуй самый удобный.

В понедельник проверю оба варианта.
devilr писал(а):
17.08.2019 20:47
Ну, лисапеды в такой простой задаче строить точно не надо. :)
В принципе согласен. Но иногда бывает быстрее написать самому программу для решения какой-то простой задачи, чем найти как она решается с помощью библиотечных функций
Spoiler
Как-то натолкнулся на Оруэлл vs Харксли.
Там было сравнение, чего опасался в будущем Оруэлл и чего опасался Хаксли.
В частности Оруэлл опасался, что правду будут запрещать (цензура)
Хаксли опасался, что правду запрещать не будут, но она утонет в море всякой ненужной информации.
В Qt огромная масса всяких функций, классов, методов, позволяющих решить практически любую задачу. Когда с ними постоянно работаешь, то найти нужный довольно просто. Но когда не пользуешься этим постоянно, то найти нужное в этой массе очень трудно.
devilr писал(а):
17.08.2019 20:47
Если в INI просто строка, то простой str.toInt(&ok, 16) вполне себе работает. Только ok надо проверять - мало ли что злобные враги в INI понапихали...
Я думаю, что по этому поводу волноваться не стоит. INI файл будет настраиваться один раз и потов к нему никто не будет иметь доступ.
Спасибо сказали:
MiK13
Сообщения: 1180
ОС: Linux Debian

Re: Как в программе на Qt получить из INI-файла значение, заданное в шестнадцатеричеом виде?

Сообщение MiK13 »

s.xbatob писал:
17.08.2019 21:22
сначала преобразовать в QString:
value(key).toString().toUInt(nullptr, 0)
Так и сделал. Первый вариант решил не проверять
Просто заменил .toUInt() на .tiString().toUInt(nullptr,0)
Проверил -- принимает значения, заданные как в шестнадцатеричном, так и в восьмеричном (ну и, само собой разумеется, в десятичном) виде.
Заодно понял, почему креатор ворчал на time(NULL) :)
Спасибо сказали:
Ответить