Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Alex_C от Май 05, 2012, 21:18



Название: Сохранить пользовательские настройки таблицы
Отправлено: Alex_C от Май 05, 2012, 21:18
Собственно хочу посоветоваться. Есть таблица (QTableView+моя переопределенная модель на основе QSqlQueryModel). Есть задача - пользователь для каждой ячейки хочет свои установки фонта/цвета/алигн и т.п.
раньше на Дельфи все делалось просто - там для каждой колонке это все есть. Сохранить-восстановить не вопрос.
В Qt есть все намного больше. Вот по этому и вопрос: модель переопределил - на data все выводится. Вот даже не знаю как сказать.. Это кашерно на data() считывать данные из QSettins?


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: Bepec от Май 06, 2012, 12:36
Я бы сказал - очень не кошерно. Даже скорее вообще не кошерно, помоему...

Я б поступил проще - в модели создал бы список палитр (ну или цветов, смотря какая реализация),  и считывал/записывал только в начале работы и конце работы программы.


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: Alex_C от Май 06, 2012, 19:36
Я б поступил проще - в модели создал бы список палитр (ну или цветов, смотря какая реализация),  и считывал/записывал только в начале работы и конце работы программы.

Вот абсолютно согласен...! Именно и хочу считывать - записывать только в начале/конце работы программы. На счет списка палитр и думал.. Но пока не придумал :) Понял - направление правильное - буду думать дальше)))


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: Alex_C от Май 08, 2012, 11:16
Вопрос: а возможно ли настройки для модели установить в начале загрузки программы через model()->setData также как это можно сделать для заголовка?
Поясню на примере:

Код:
    QString fieldName;
    for(int i = 0; i < model()->columnCount(); i++)
    {
        fieldName = getFieldNameByIndex(i);
        model()->setHeaderData(i, Qt::Horizontal,
                               setting->value("Column" + QVariant(i).toString() + "Name",
                                              fieldName).toString());
        setColumnHidden(i, setting->value("Column" +
                                          QVariant(i).toString() + "Hidden").toBool());
    }

здесь установки заголовков установили. И сделать что то аналогичное:

Код:
        model()->setData(index, myFont, Qt::FontRole);
        model()->setData(index, QColor(Qt::green), Qt::TextColorRole);

но здесь первый параметр у setData - QModelIndex, по этому также как заголовком не получится пройтись по столбцам, установив для них единые настройки.


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: Bepec от Май 08, 2012, 21:45
Я ему в лоб, он себе по лбу.

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


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: Alex_C от Май 08, 2012, 23:45
Я тебе предлагаю сделать свою функцию установки/записи/чтения цветов, а ты мне предлагаешь извращённый(в тематику первой части предложения) вариант использования стандартных настроек.

Да не ругайся. Сделал уже, давно причем :
Код:
struct CellView
{
    QFont font;
    QColor fontColor;
    QColor backgroundColor;
    Qt::AlignmentFlag aligment;
};

далее
Код:
   
CellView s;
 for(int i = 0; i < model()->columnCount(); i++)
    {
        fieldName = getFieldNameByIndex(i);
        s.font = qvariant_cast<QFont>(setting->value("Column" + QVariant(i).toString() + "Font",
                                fieldName));
        s.fontColor = qvariant_cast<QColor>(setting->value("Column" + QVariant(i).toString() + "Color",
                                     fieldName));
        s.backgroundColor = qvariant_cast<QColor>(setting->value("Column" + QVariant(i).toString() + "BackColor",
                                           fieldName));
        s.aligment = Qt::AlignmentFlag(setting->value("Column" + QVariant(i).toString() + "Aligment",
                                                      fieldName).toInt());
        m_cellView->replace(i, s);

    }
}
далее етот s .передовать  в модель.


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: Bepec от Май 09, 2012, 23:00
Как вариант сгодится ;)

Хм... Я б посоветовал такую фигню (не в обиду, или укор, просто много букаф там) хранить в файле рядом с прогой, а не засорять реестр. Ибо насколько я помню, в Qt удаление записей с реестра оч муторное и не до конца работает ;)


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: Alex_C от Май 10, 2012, 08:44
Хм... Я б посоветовал такую фигню (не в обиду, или укор, просто много букаф там) хранить в файле рядом с прогой, а не засорять реестр. Ибо насколько я помню, в Qt удаление записей с реестра оч муторное и не до конца работает ;)

Совершенно согласен - я все настройки только в ini-файлах храню. Так и скомпа на комп проще программуу переносить, да и не нужно прав администратора, чтоб на семерке в реестр писать.


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: Serr500 от Май 10, 2012, 09:54
В ветку HKCU можно писать без прав администратора. А .ini в Program Files либо не запишется вообще, либо отобразится в Virtual Store.


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: V1KT0P от Май 10, 2012, 10:13
В ветку HKCU можно писать без прав администратора. А .ini в Program Files либо не запишется вообще, либо отобразится в Virtual Store.
Для этого существует отдельная папка для каждого пользователя. Мало того что она решает проблему с записью, так еще она решает важную задачу: отдельные настройки приложения для каждого пользователя. Те кто создают ini файлы там где может быть запрещена запись являются ССЗБ.


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: Bepec от Май 10, 2012, 10:17
Serr500 я писал же - в Qt удаление записей плохо реализовано. Можно удалить записи, а каталоги удалить нельзя. Т.е. структура папок в реестре останется и будет глаза мозолить.

Сам когда то пытался делать установщик и уткнулся в этот затык. Запись делете - пожалуйста. Папку - фиг. Потому остаётся мусор.

PS А если нельзя писать в program files, любая программа, хранящая там настройки(или изменяющая свои файлы), работать не будет. А таких % 90, если не все 100.

PPS писать ini можно и в папку юзверя. Так, ради прикола ;)

update to Виктор:

Заблокированная папка Program Files => невозможность установки программы => программа не установлена => программа не работает => нефиг устанавливать её с разрешёнными правилами, а использовать без них => надо в установщике просто дать выбор папки для установки => профит. А тупые пользователи, да "пересекретничавшие" администраторы испоганят всё. 


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: V1KT0P от Май 10, 2012, 10:28
Заблокированная папка Program Files => невозможность установки программы => программа не установлена => программа не работает => нефиг устанавливать её с разрешёнными правилами, а использовать без них => надо в установщике просто дать выбор папки для установки => профит. А тупые пользователи, да "пересекретничавшие" администраторы испоганят всё. 
Ну вот я работаю из под ограниченной учетки, а программы устанавливаю из под админа. Правда я редко устанавливаю программы в Program Files, но те что установил туда работают нормально =).


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: Bepec от Май 10, 2012, 10:48
Угу. А какие программы, если не секрет? Тот же тотал коммандер/опера/лиса хранят часть настроек  в Common Files в Program Files. ;)


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: V1KT0P от Май 10, 2012, 11:04
Угу. А какие программы, если не секрет? Тот же тотал коммандер/опера/лиса хранят часть настроек  в Common Files в Program Files. ;)
Основные программы которые работают : 7-Zip, Audacity, Softimage 2011, FileZilla Server, GIMP, Mathcad 14, Firefox, Thunderbird, OpenVPN, OpenOffice, Opera, Pidgin, ViewletCam2, VirtualDub, Wireshark, Xilisoft
И те что приходится запускать из-под админа: Proteus 7 Professional

Но я уже выработал привычку ставить все на другой раздел.


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: Bepec от Май 10, 2012, 12:39
Половина приведённых тобой программ пишет в common files ;)

А другой раздел - да, правильное решение ;)

Я себе как SSD приобрёл, все проги напрочь с системного диска убрал. Нафиг надо дополнительную нагрузку :)


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: V1KT0P от Май 10, 2012, 15:59
Половина приведённых тобой программ пишет в common files ;)
В Common files запрещено мне писать, но программы тем не менее работают. Вот только надоедает от админа запускать Firefox для обновления.


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: Bepec от Май 11, 2012, 00:02
Не буду спорить - тут все тонкости в нюансах ;)

PS ну частично правы оба - писать некошерные программы - нехорошо, но и устанавливать кошерные программы в места, урезанные правами - нехорошо. Для того выбор каталога и существует ;)


Название: Re: Сохранить пользовательские настройки таблицы
Отправлено: Alex_C от Май 11, 2012, 08:47
Я  очень долго думал над этой проблемой, т.к. одним из условий работы моей программы является возможность работы с флешки , вообще не зависимо от компьютера + максимально возможная работы в любой конфигурации/прав пользователя (на сколько это возможно).
Все что ниже написано - естественно сделано для винды. При запуске моя программа проверяет следующее:
1. Проверка версии винды.
2. Если операционка >= WinXP, проверяем права администратора и проверяем, установлена ли программа в ProgramFiles. Причем права админа определяются через CheckTokenMembership - это на семерке позволяет узнать, запущена ли программа через меню "Запустить от имени администратора".
3. Если права админа есть - пишем ini в папку программы. Если нет - определяем путь куда винда предлагает пользовательские настройки писать.
Такой вариант позволяет достичь максимально возможной свободы по установке программы в любые папки по желанию пользователя.