Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ale4ko от Сентябрь 22, 2011, 23:28



Название: виджеты зависящие от пользовательских разрешений
Отправлено: ale4ko от Сентябрь 22, 2011, 23:28
Привет всем.
В настоящее время разрабатываю программу на Qt 4.7.3
Я хочу, чтобы часть моих виджетов зависели от пользовательских разрешений (permission).
Например, я хочу сделать,какие-то виджеты невидимыми (если есть пользователь не являеться админом)
но (!) я не хочу писать в своем приложении следующий код:
QWidget * MyWidget = ....
...
MyWidget-> SetVisible (permission_admin == || == permission_Manager);

Может быть у кого-нибудь есть идеи на сей счет?


Название: Re: виджеты зависящие от пользовательских разрешений
Отправлено: Nimbus от Сентябрь 23, 2011, 05:19
Не хотите, а придётся  ;)
Ну или создайте базовый класс (если для каждого неохота вызывать setVisible), реализуя в нём видимость по пермишнам, для своих виджетов и наследуйте от него необходимые.

>permission_admin == || == permission_Manager
Что это за конструкция? :)


Название: Re: виджеты зависящие от пользовательских разрешений
Отправлено: PavelVX от Сентябрь 23, 2011, 05:31
мне тоже интересно что это за конструкция, но думаю автор хотел так:
permission_admin == true || true == permission_Manager


Название: Re: виджеты зависящие от пользовательских разрешений
Отправлено: lit-uriy от Сентябрь 23, 2011, 13:36
>>я не хочу писать в своем приложении следующий код:
приведи пример того, как хочешь


Название: Re: виджеты зависящие от пользовательских разрешений
Отправлено: ale4ko от Сентябрь 23, 2011, 20:06
Ну во первых я конечно же ошибся,я имел ввиду
MyWidget-> SetVisible (permissions == Admin || permissions == Manager);

Мне хотелось бы что бы виджеты ,при активизировании нового пользователя, могли становиться видимыми и не видимыми,
или например не используемыми (SetEnable (false))
Задача написать dll, в которой будет сидеть компонента/некий класс предположим,
к которому сможет обращаться некий exe (возможно даже несколько клиентских аппликаций),и каждый виджет в этом ехе
будет visible/invisible или enabled/disabled,на основе того что скажет класс в деилельки.


Название: Re: виджеты зависящие от пользовательских разрешений
Отправлено: asvil от Сентябрь 24, 2011, 11:05
дллка не нужна.
Несложный путь:
1. Создать глобальную переменную - список всех виджетов, подлежащих "разрешениям".
2. Каждому виджету или объекту назначить имя (setObjectName)
3. Засунуть каждый виджет в глобальную переменнную в п1.
4. Создать глобальный словарь разрешений текущего пользователя QHash(имя объекта, QHash(свойство, значение))
5. В цикле обновлять свойства всех объектов их переменной п1 исходя из их значений в п4.

Примерно.
Код:
QList<QObject*> objects;
QHash<QString, QHash<QString, QVariant> > permissions.

foreach(QObject* object, objects) {
  foreach(const QString& property, permissions[object->objetName()].keys()) {
    object->setProperty(property, permissions[object->objetName()][property]);
  }
}

Создание разрешения на просмотр выглядит так:
Код:
QWidget *wdg = new QWidget();
wdg->setObjectName("Journal");

permissions[wdg->objectName()]["visible"] = true;


Название: Re: виджеты зависящие от пользовательских разрешений
Отправлено: Igors от Сентябрь 24, 2011, 14:15
Впечатление что в конце-концов дело все равно сведется к банальным if/switch. Пропердии хороши для enable/disable, но вряд ли для чего-то большего. Обычно находятся диалоги которые должны выглядеть по-разному в зависимости от прав пользователя. Их проще модифицировать в runtime (перед show) чем создавать сложную общую конструкцию. Задача близка к demo/full version


Название: Re: виджеты зависящие от пользовательских разрешений
Отправлено: ale4ko от Сентябрь 24, 2011, 22:48
Спасибо большое за ответы!
Наверное воспользуюсь советом Филоненко Михаила.
Igors а как же мне построить диалоги если я как раз не хочу использовать банальные if/switch?
Мне нужно написать это в отдельном модуле,как я писал раньше, и этот модуль ,как раз, и должен
контролировать постройку диалогов для пользователей с разными правами.


Название: Re: виджеты зависящие от пользовательских разрешений
Отправлено: Igors от Сентябрь 25, 2011, 09:42
Igors а как же мне построить диалоги если я как раз не хочу использовать банальные if/switch?
Мне нужно написать это в отдельном модуле,как я писал раньше, и этот модуль ,как раз, и должен
контролировать постройку диалогов для пользователей с разными правами.
Что понимать под постройкой/настройкой? Сделать некоторые айтемы disabled? Это прекрасно обобщается, но, как правило, требуется больше. Простой пример: откомпилил демо, по-простому задизаблил Save и Save As. Получил мешок глупых вопросов типа "а почему они серые и что надо делать чтобы они стали доступны?" После бесполезных попыток объяснить что это демо сделал так: сначала Save разрешен, если нажимается, то показывается алерт ("в демо сохранять нельзя") и тогда уже Save становится дизаблед. 


Название: Re: виджеты зависящие от пользовательских разрешений
Отправлено: asvil от Сентябрь 25, 2011, 14:33
В QVariant можно засунуть callback, который и определит механизм доступа к объекту.


Название: Re: виджеты зависящие от пользовательских разрешений
Отправлено: ale4ko от Сентябрь 25, 2011, 23:45
Ясно.
Спасибо.

А кстати, в качестве ключа в QHash хотелось бы передовать какое либо уникальное значение(unique) ,
wdg->objectName не подойдет, т.к. в разных классах могут быть мэмберы с одинаковыми именами,
а какое тогда использовать?