Russian Qt Forum
Сентябрь 30, 2024, 16:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: виджеты зависящие от пользовательских разрешений  (Прочитано 4447 раз)
ale4ko
Гость
« : Сентябрь 22, 2011, 23:28 »

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

Может быть у кого-нибудь есть идеи на сей счет?
Записан
Nimbus
Гость
« Ответ #1 : Сентябрь 23, 2011, 05:19 »

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

>permission_admin == || == permission_Manager
Что это за конструкция? Улыбающийся
Записан
PavelVX
Гость
« Ответ #2 : Сентябрь 23, 2011, 05:31 »

мне тоже интересно что это за конструкция, но думаю автор хотел так:
permission_admin == true || true == permission_Manager
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Сентябрь 23, 2011, 13:36 »

>>я не хочу писать в своем приложении следующий код:
приведи пример того, как хочешь
Записан

Юра.
ale4ko
Гость
« Ответ #4 : Сентябрь 23, 2011, 20:06 »

Ну во первых я конечно же ошибся,я имел ввиду
MyWidget-> SetVisible (permissions == Admin || permissions == Manager);

Мне хотелось бы что бы виджеты ,при активизировании нового пользователя, могли становиться видимыми и не видимыми,
или например не используемыми (SetEnable (false))
Задача написать dll, в которой будет сидеть компонента/некий класс предположим,
к которому сможет обращаться некий exe (возможно даже несколько клиентских аппликаций),и каждый виджет в этом ехе
будет visible/invisible или enabled/disabled,на основе того что скажет класс в деилельки.
Записан
asvil
Гость
« Ответ #5 : Сентябрь 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;
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Сентябрь 24, 2011, 14:15 »

Впечатление что в конце-концов дело все равно сведется к банальным if/switch. Пропердии хороши для enable/disable, но вряд ли для чего-то большего. Обычно находятся диалоги которые должны выглядеть по-разному в зависимости от прав пользователя. Их проще модифицировать в runtime (перед show) чем создавать сложную общую конструкцию. Задача близка к demo/full version
Записан
ale4ko
Гость
« Ответ #7 : Сентябрь 24, 2011, 22:48 »

Спасибо большое за ответы!
Наверное воспользуюсь советом Филоненко Михаила.
Igors а как же мне построить диалоги если я как раз не хочу использовать банальные if/switch?
Мне нужно написать это в отдельном модуле,как я писал раньше, и этот модуль ,как раз, и должен
контролировать постройку диалогов для пользователей с разными правами.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Сентябрь 25, 2011, 09:42 »

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

В QVariant можно засунуть callback, который и определит механизм доступа к объекту.
Записан
ale4ko
Гость
« Ответ #10 : Сентябрь 25, 2011, 23:45 »

Ясно.
Спасибо.

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


Страница сгенерирована за 0.178 секунд. Запросов: 22.