| чт 12 Май 2011 | | Разместил(а): ib | | Просмотров: менее 10 |
При переходе на Qt возник вопрос - как и в каком формате хранить настройки программы и локальную базу данных. Первое что предлагает Qt - использовать формат XML. Но это очень тяжёлый формат для того, что бы хранить какой-то простенький список настроек программы, в котором всего-то несколько секций. Также и для локальной БД он не очень-то удобен - слишком много потребуется не только преобразовывать, но и переделывать код с Delphi. Я бы вообще использовал формат JSON для хранения локальных данных (использую в веб-проектах как наименее ёмкий текстовый формат), но для него под Delphi не было подходящих готовых решений.
Теперь к делу. Есть в Qt такой класс - QSettings, который предназначен для работы с файлами настроек приложений, в т.ч. и с INI-файлами. Первое возникшая неприятность - это способ хранения русских символов - он почему-то сохраняет их только в UTF-8 в виде %CF%C0%D0%C0%CC%C5%D2%D0_1=\xc7\xed\xe0\xf7\xe5\xed\xe8\xe5 \xef\xe0\xf0\xe0\xec\xe5\xf2\xf0\xe0 1 (что есть слово "ПАРАМЕТР_1=Значение параметра 1"). Но считывает и распознаёт обратно правильно. Таким образом, о применении русских названий параметров можно забыть, т.к. это не эстетично. Второе - в Delphi можно было бы написать PARAMNAME=abcd;efg, ijk и значение параметра считывалось как и предполагалось - целиком всё после первого знака равно, в Qt же всё сложнее - что бы значение со знаками ";" и "," не обрезалось до ";" или вовсе не считалось (и такое было), значение округляется в двойные кавычки, т.е. PARAMNAME="abcd;efg, ijk".
Порадоволо, что QSettings поддерживает субсекции (составные ключи), а также что можно работать относительно части заданного ключа, т.е. не писать весь путь полностью (beginGroup() и endGroup()).
Далее выложены примеры чтения и сохранения настроек приложения:
QSettings options(dirProg+"options.ini", QSettings::IniFormat); // Второй аргумент - тип файла настроек
options.beginGroup("main"); // Будем считывать параметры в секции main // Работа со строками
QString currentlang = options.value("currentlang", "ru").toString();
langs_code = options.value("langs_code", "ru;en").toString().split(";");
for (int i = 0; i < langs_code.count(); i++) {
if (langs_code.at(i) == currentlang) ui->cbLang->setCurrentIndex(i);
}dbLogin = options.value("dblogin", "root").toString();
dbPW = options.value("dbpw", "password").toString(); // Считываем прошлое положение главного окна приложения и тут же применяем
mainWin->setGeometry(
options.value("left", 200).toInt(),
options.value("top", 250).toInt(),
options.value("width", 800).toInt(),
options.value("height", 600).toInt()
);ui->cbIniNameWithTime->setChecked(options.value("ininamewithtime", 1).toBool());
ui->cbAutoConnectDB->setChecked(options.value("autoconnectdb", 0).toBool());
ui->cbAutoSave->setChecked(options.value("autosave", 0).toBool());
ui->cbNoMKU->setChecked(options.value("nohardware", 0).toBool());
ui->cbDebug->setChecked(options.value("debug", 0).toBool());
ui->edLogin->setText(dbLogin);
ui->edPW->setText(dbPW);
options.endGroup();
Пример сохранения настроек:
QSettings options(dirProg+"options.ini", QSettings::IniFormat);
options.beginGroup("main");
options.setValue("currentlang", langs_code.at(ui->cbLang->currentIndex()));
options.setValue("debug", ui->cbDebug->isChecked());
options.setValue("ininamewithtime", ui->cbIniNameWithTime->isChecked());
options.setValue("autoconnectdb", ui->cbAutoConnectDB->isChecked());
options.setValue("autosave", ui->cbAutoSave->isChecked());
options.setValue("nohardware", ui->cbNoMKU->isChecked());
options.setValue("dblogin", ui->edLogin->text());
options.setValue("dbpw", ui->edPW->text());
options.setValue("width", mainWin->width());
options.setValue("height", mainWin->height());
options.setValue("left", mainWin->geometry().left());
options.setValue("top", mainWin->geometry().top());
options.endGroup();
Updated: 2012-02-23 11:53:30







