Russian Qt Forum

Qt => Общие вопросы => Тема начата: OS2 от Октябрь 15, 2008, 11:44



Название: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 15, 2008, 11:44
Всем доброго времени суток!
Нашел на сайте интересный компонент: http://hardclub.donntu.edu.ua/projects/qt/components/datafile.htm
для работы с ini файлами. Скачал и решил им воспользоваться.
Но как оказалось он написан под Qt 3.3, из-за чего возникло много ошибок, при компиляции на Qt 4.4, большенство из них я победил, но осталось несколько ошибок, с которыми я ничего не могу поделать (на Qt програмирую недавно).
Подскажите, ктонибудь переводил компонент TDataFile под Qt 4? Или может кто знает аналогичные компоненты, для работы с ini файлами.

ЗЫ: вот ошибки, которые я так и не смог победить:

Цитировать
tdatafile.cpp(15) : error C2512: 'QMapIterator<Key,T>' : no appropriate default constructor available
        with [  Key=QString, T=type_ValueList  ]
tdatafile.cpp(120) : error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)
tdatafile.cpp(200) : error C2679: binary '=' : no operator found which takes a right-hand operand of type 'QMap<Key,T>::iterator' (or there is no acceptable conversion)
        with [ Key=QString, T=type_ValueList ]
tdatafile.cpp(201) : error C2678: binary '!=' : no operator found which takes a left-hand operand of type 'QMapIterator<Key,T>' (or there is no acceptable conversion)
        with [ Key=QString, T=type_ValueList ]
tdatafile.cpp(207) : error C2678: binary '==' : no operator found which takes a left-hand operand of type 'QMapIterator<Key,T>' (or there is no acceptable conversion)
        with [ Key=QString, T=type_ValueList ]
tdatafile.cpp(209) : warning C4172: returning address of local variable or temporary
tdatafile.cpp(215) : error C2678: binary '==' : no operator found which takes a left-hand operand of type 'QMapIterator<Key,T>' (or there is no acceptable conversion)
        with [ Key=QString, T=type_ValueList ]

Всем заранее спасибо!


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: spirit от Октябрь 15, 2008, 11:55
QSettings не смотрели?


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 15, 2008, 12:23
Смотрел, но нужна работа именно с ini файлами (или им подобными).
А по поводу ошибок, ничего подсказать не можете?


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: spirit от Октябрь 15, 2008, 12:25
так QSettings позволяет использовать ini формат , нужно в конструктор передать правильный параметр
Цитировать
QSettings::IniFormat | 1 | Store the settings in INI files.


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: pastor от Октябрь 15, 2008, 12:27
Смотрел, но нужна работа именно с ini файлами (или им подобными).
А по поводу ошибок, ничего подсказать не можете?

QSettings может работать с ини-файлами, см. ассистант.


По поводу ошибок, то неплохобы было показать проблемный код


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 15, 2008, 12:36
2 pastor
Цитировать
По поводу ошибок, то неплохобы было показать проблемный код
Вот определение класса:
Код:
typedef QMap<QString, QString> type_ValueList;

class TDataFile
{
public:
TDataFile(const QString &name = QString::null);
~TDataFile();
........................................

protected:
........................................
QMap<QString, type_ValueList> SectionList;          //Вот сэтим, возможно проблемма
QMapIterator<QString, type_ValueList> mi; //Или с этим
};

Реализация:
Код:
TDataFile::TDataFile(const QString &name)   //тут чтото еще надо инициализировать, для Qt 4.4
{
setFileName(name);
}
......................................
bool TDataFile::useSection(const QString &section)
{
mi = SectionList.find(section.toLower());          //На это ругается
return (mi != SectionList.end());
}
......................................
bool TDataFile::openRead()
{
if (!f.open(QIODevice::ReadOnly)) return false;
ts.setDevice(&f);
// prepare
SectionList.clear();
mi = NULL;                              //И на это тоже ругается
..............................
}
..............................


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 15, 2008, 12:38
2 spirit
Цитировать
так QSettings позволяет использовать ini формат , нужно в конструктор передать правильный параметр
Тоесть и под виндой и под линуксом позволяет коректно читать ini файлы?


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: spirit от Октябрь 15, 2008, 12:38
ага
Цитировать
The QSettings class provides persistent platform-independent application settings.


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 15, 2008, 12:41
А ты случайно не в курсе, с Qt какиенибудь примеры работы с ini файлами (через QSettings) идут?


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: spirit от Октябрь 15, 2008, 12:43
в курсе
см. тут
Цитировать
QTDIR/examples/tools/settingseditor/


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 15, 2008, 12:44
Большое спасибо, щас посмотрим....  ;D


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: pastor от Октябрь 15, 2008, 12:50
2 OS2:

По поводу ошибки, попробуй заинклудить QMap:

Код:
...
#include <QMap>
...

typedef QMap<QString, QString> type_ValueList;

class TDataFile
{
public:
TDataFile(const QString &name = QString::null);
~TDataFile();
........................................

protected:
........................................
QMap<QString, type_ValueList> SectionList;          //Вот сэтим, возможно проблемма
QMapIterator<QString, type_ValueList> mi; //Или с этим
};

ЗЫЖ Дл портирования приложения с Qt3 на Qt4 есть утилита qt3to4. Также почитай про портирование в ассистанте Porting from Qt 3 to Qt 4 (http://doc.trolltech.com/4.4/porting4.html)


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 15, 2008, 12:53
Все инклюды есть, из экономии места я их просто не привел:
Код:
#include <qvariant.h>
#include <qwidget.h>
#include <qfile.h>
#include <qstring.h>
#include <qstringlist.h>
#include <qtextstream.h>
#include <qmap.h>
#include <qcolor.h>
#include <qrect.h>


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: spirit от Октябрь 15, 2008, 12:54
а они в ашнике или в cpp?


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 15, 2008, 12:58
Кто, они?  ???


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 15, 2008, 12:58
А, все, понял, в cpp!


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: spirit от Октябрь 15, 2008, 12:59
инклуды где находятся, в файле с конструкцией
Цитировать
typedef QMap<QString, QString> type_ValueList;
т.е. ашнике или в cpp?


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 15, 2008, 13:00
Утилитку qt3to4, тоже пробовал, но она не помогла, процентов 90 всех ошибок исправил сам, остались те, что я привел....


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: spirit от Октябрь 15, 2008, 13:00
ну так значит надо поместить инклуд
Цитировать
#include <QMap>
 там где typedef находится.


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 15, 2008, 13:02
2 spirit
Извини!  ;D
В файле с конструкцией.


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: pastor от Октябрь 15, 2008, 13:31
Кто, они?  ???

Инклуды с предыдущего твоего поста


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: lit-uriy от Октябрь 15, 2008, 13:52
ini-формат на юниксах подразумевает conf-файлы, а не ini-формат как в виндовозе.
Цитировать
On Unix, NativeFormat and IniFormat mean the same thing, except that the file extension is different (.conf for NativeFormat, .ini for IniFormat).


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 15, 2008, 14:18
2 lit-uriy
Чтото я не пойму, если у меня есть ini файл, например: test.ini (написанный СТРОГО в формате ini), то под виндой он будет читаться (при помощи QSettings), а под линухом нет?  :o


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: spirit от Октябрь 15, 2008, 14:20
будет он и под линуксом читаться.


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: pastor от Октябрь 15, 2008, 14:28
ini-формат на юниксах подразумевает conf-файлы, а не ini-формат как в виндовозе.
Цитировать
On Unix, NativeFormat and IniFormat mean the same thing, except that the file extension is different (.conf for NativeFormat, .ini for IniFormat).

Попробую перевести фразу что ты привел:

"В Unix, NativeFormat и IniFormat подразумевают одно и тоже, за исключением расширения (.conf для NativeFormat, .ini для IniFormat)"

Так что все ок.


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 15, 2008, 14:30
Спасибо за разъяснение!


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: lit-uriy от Октябрь 15, 2008, 15:59
ini-формат на юниксах подразумевает conf-файлы, а не ini-формат как в виндовозе.
Цитировать
On Unix, NativeFormat and IniFormat mean the same thing, except that the file extension is different (.conf for NativeFormat, .ini for IniFormat).

Попробую перевести фразу что ты привел:

"В Unix, NativeFormat и IniFormat подразумевают одно и тоже, за исключением расширения (.conf для NativeFormat, .ini для IniFormat)"

Так что все ок.
А в Юниксах нэйтив формат с каких пор ini? там формат config.
В нем нет секций и стиль коментариев другой. или я что-то пропустил?


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 15, 2008, 16:16
Товарищи, в догонку возник вопрос по чтению русской строки из ini файлов.
При попытке считать русскую строку, выводится всякая белиберда, как декодировать ее в читабельный русский? Единственный извесный мне метод, это QString::fromLocal8Bit, но он в качестве аргумента принимает const char*, а не QString, как быть? Как переконвертировать, полученный мной из ini, русский QString?
Заранее спасибо!


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: spirit от Октябрь 15, 2008, 17:51
QTextCodec


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 15, 2008, 20:03
Пробовал QTextCodec, но она конвертирует только часть русской строкию
исходная строка (QString s):
Цитировать
абвгдеёжзийклмнопрстуфхцчшщьъыюя1234567890АБВГДОПРСТУФХЦЧЕЩЬЪЫЮЯ
получаем (char *str):
Цитировать
абв?деёжзийкл?ноп?с?уф?цчшщьъы?я1234567890АБВ?ДОП?С?УФ?ЦЧЕЩЬЪЫ?Я

Вот код:
Код:
void Convert(QString s,char *str)
{
static QTextCodec *codec = QTextCodec::codecForName("windows-1258");

QByteArray ba = codec->fromUnicode(s);
memcpy( str, ba.data(), ba.size() );
str[ ba.size() ] = 0;
}
В чем ошибка?

ЗЫ: пробовал и windows-1251 и windows-1250, не помогает...  :-[


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: Пантер от Октябрь 15, 2008, 20:08
Интересно. Попробуй 1252.


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 15, 2008, 20:36
Ты гений  ;D Спасибо!  :D


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: Пантер от Октябрь 15, 2008, 20:41
В винде по умолчанию 1252, приходится вручную исправлять на 1251 в реестре.


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 26, 2008, 14:43
Просьба помочь, кто знает.
При переходе в Linux возникла еще одна проблема с конвертацией русских строк, считанных из ini файлов.
В Линухе, вместо:
Код:
m_codec = QTextCodec::codecForName("windows-1252");
устанавливаю кодек (или KOI8-R):
Код:
m_codec = QTextCodec::codecForName("UTF-8");
Но Qt русские строки считывать не хочет, никак не могу понять, где я ошибаюсь?
Алгаритм приблизительно такой:
Код:
#ifdef Q_OS_WIN32
m_codec = QTextCodec::codecForName("windows-1252"); //Настраиваем кодек
#endif
#ifdef Q_OS_LINUX
m_codec = QTextCodec::codecForName("UTF-8");
#endif

.............

char sz[1024];
to_RUS( m_pINIfile->value( sKeyName, sDefault ).toString(), sz ); //тут считываем русскую строку из ini
QString sReturnedString = QString::fromLocal8Bit( sz ); //В винде здесь уж русская строка, в Линухе - кракозябры

.............

void to_RUS( QString s, char *ascii )
{
QByteArray ba = m_codec->fromUnicode(s);
memcpy( ascii,ba.data(),ba.size() );
ascii[ba.size()] = 0;
}
Помогите, плиз....  >:(


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: xintrea от Октябрь 28, 2008, 00:09
1. В линухе у тебя какая кодировка локали?

2. Если кодировка локали UTF-8, то использовать fromLocal8Bit() походу неправильно.

3. А в какой кодировке у тебя сделан сам ini файл?


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 28, 2008, 01:20
Цитировать
1. В линухе у тебя какая кодировка локали?
Точно не знаю, а как это посмотреть?  ;)
Код:
2. Если кодировка локали UTF-8, то использовать fromLocal8Bit() походу неправильно.
Кодировка русской мандривы (та, что по умолчанию). Попробую обойтись без fromLocal8Bit()....  :-\
Цитировать
3. А в какой кодировке у тебя сделан сам ini файл?
Он создавался под виндой, походу - 1252.  8)


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: Пантер от Октябрь 28, 2008, 07:16
Гы. Если он в кодировке 1252, то и не нужно никаких ifdef. :) Код будет одинаковый под обеими осями.


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 28, 2008, 11:22
2 panter_dsd
ini файл создан под виндой, но при просмотре его под Линухом русский шрифт не читабилен (даже если просто смотреть его едитом).


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: Пантер от Октябрь 28, 2008, 12:19
Что у тебя показывает команда locale?
Походу у тебя просто локаль не utf8.


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 28, 2008, 15:52
locale показывает:
Цитировать
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: BRE от Октябрь 28, 2008, 16:37
Вот так попробуй:
Код:
m_codec = QTextCodec::codecForName( "windows-1252" );

QString val = m_codec->toUnicode( m_pINIfile->value( sKeyName, sDefault ).toByteArray() );


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 28, 2008, 17:00
Так уже пробовал. Не помогает.
В этом случае даже под виндой отказывается русский текст из ини читать...


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: BRE от Октябрь 28, 2008, 17:32
Так уже пробовал. Не помогает.
В этом случае даже под виндой отказывается русский текст из ини читать...

Вот тестовый пример, под linux работает.
Строка в ini файле в кодировке windows-1251.
Код:
#include <QCoreApplication>
#include <QSettings>
#include <QTextCodec>
#include <QDebug>

int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
qDebug("Start...");

QSettings s( "Company", "tst" );

QTextCodec *codec = QTextCodec::codecForName( "windows-1251" );

QVariant v = s.value( "value1", "Default value1" );

QString val = codec->toUnicode( v.toByteArray() );
qDebug() << val;

return 0;
}

Если будет нужно, сброшу и ini-файл.  ;D

Еще обрати внимание на defaultValue в QSettings::value(), кодировки должны совпадать в файле исходника и ini-файле.


Название: Re: Работа с ini файлами под Qt 4.4 и выше (компонент TDataFile)
Отправлено: OS2 от Октябрь 28, 2008, 17:48
Всем спасибо, сам разобрался.
Вот мой окончательный вариант:
Код:
m_codec = QTextCodec::codecForName("windows-1251");
*sReturnedString = m_codec->toUnicode( m_pINIfile->value( sKeyName, sDefault ).toByteArray() );
Проверил, работает и под Линухом и под Виндой.