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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Режим выбора  (Прочитано 5845 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Апрель 28, 2011, 09:38 »

Добрый день

Есть N НЕмодальных окон. Пользователь может переключаться с одного на другое и вводить данные. Возникают ситуации когда один диалог требует других, напр:

- укажите позицию объекта
- укажите какой (другой) объект нужен данному
и.т.п.

Сделать такой выбор модальным не выходит. Напр. "выберите объект" - а он может находиться и в окне где общий список или отображен в одном или нескольких др окон (и пользователю надо просто кликнуть на него). То есть в режиме выбора надо разрешать переключения между окнами и какие-то действия в них. С др. стороны нельзя разрешать ввод данных в режиме выбора.

Сейчас я решаю эту проблему "в лоб" вставкой "if/switch" там и сям. Понимаю что это плохо - плодится много глобальных переменных и проверок обобщить которые не удается.

Какие есть подходы?
Спасибо
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Апрель 28, 2011, 10:15 »

Без схемы/рисунка/скриншота как-то трудно представить ситуацию.
Записан

Qt 5.11/4.8.7 (X11/Win)
SABROG
Гость
« Ответ #2 : Апрель 28, 2011, 10:23 »

Без схемы/рисунка/скриншота как-то трудно представить ситуацию.

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

Похоже только дизаблить нужные окна по сигналу, который мог бы приходить от диалога и раздизаблить на закрытие.
« Последнее редактирование: Апрель 28, 2011, 10:41 от SABROG » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Апрель 28, 2011, 10:48 »

Он хочет сделать модальный диалог относительно конкретных окон, чтобы можно было задать какие окна перестанут реагировать на действия пользователя, пока диалог не будет закрыт.
Ну "почти" так. Режим выбора начинается с выставления popup окна (т.е. оно не модально, но не может быть никем перекрыто) в котором короткий текст (что нужно выбрать) и кнопка Cancel. Однако нельзя отключить полностью действия пользователя в др. окнах. Пример

- в одном из окон нарисован круг. В "нормальном" режиме пользователь может выбрать его и тащить мышей. В режиме выбора - только выбрать. На этом режим выбора может закончиться (и имя выбранного круга появится в окне из которого начинали) или продолжаться если выбор "мульти"
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Апрель 28, 2011, 10:57 »

Цитировать
Он хочет сделать модальный диалог относительно конкретных окон, чтобы можно было задать какие окна перестанут реагировать на действия пользователя, пока диалог не будет закрыт.
Можно помечать такие окна как "read-only" и в своём QApplication::notify() дропать мышиные и клавиатурные события для таких окон.

Как-то так:
Код
C++ (Qt)
bool Application::notify( QObject* o, QEvent* e )
{
QWidget* w = o->isWidgetType() ? qobject_cast< QWidget* >( o ) : 0;
 
if( w && w->window()->property( "_read-only" ).toBool() )
{
switch( e->type() )
{
case QEvent::KeyPress:
case QEvent::KeyRelease:
case QEvent::MouseButtonPress:
case QEvent::MouseButtonRelease:
case QEvent::MouseButtonDblClick:
case QEvent::MouseMove:
case QEvent::ContextMenu:
case QEvent::Wheel:
e->accept();
return false;
default:
break;
}
}
 
return QApplication::notify( o, e );
}
 
« Последнее редактирование: Апрель 28, 2011, 11:04 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
SABROG
Гость
« Ответ #5 : Апрель 28, 2011, 11:06 »

- в одном из окон нарисован круг. В "нормальном" режиме пользователь может выбрать его и тащить мышей. В режиме выбора - только выбрать. На этом режим выбора может закончиться (и имя выбранного круга появится в окне из которого начинали) или продолжаться если выбор "мульти"

Может тогда посмотреть в сторону QStateMachine?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #6 : Апрель 28, 2011, 13:14 »

Цитировать
Есть N НЕмодальных окон. Пользователь может переключаться с одного на другое и вводить данные. Возникают ситуации когда один диалог требует других, напр:

- укажите позицию объекта
- укажите какой (другой) объект нужен данному
и.т.п.
Имхо, конечно, но я бы пересмотрел архитектуру. Заставлять пользователя искать и открывать другой диалог, чтоб адекватно продолжить действия с первым..
На мой взгляд диалог должен быть самодостаточен.. На крайняк в самом диалоге можно просто вызвать требуемой другой диалог, ввести в него значения, закрыть и продолжить работать.
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Апрель 28, 2011, 13:32 »

Можно помечать такие окна как "read-only" и в своём QApplication::notify() дропать мышиные и клавиатурные события для таких окон.
В принципе так сейчас и делаю. Кое-что удается сразу пресечь фильтром (KeyPresы/KeyRelease) но далеко не все, многие мышиные события контекстно-зависимы, поэтому большое количество "if" все же (неприятно) проникает

Может тогда посмотреть в сторону QStateMachine?
Никогда не пользовался. Не могли бы Вы (популярно) пояснить в чем там суть и как это может мне помочь?
Спасибо

Имхо, конечно, но я бы пересмотрел архитектуру. Заставлять пользователя искать и открывать другой диалог, чтоб адекватно продолжить действия с первым..
На мой взгляд диалог должен быть самодостаточен.. На крайняк в самом диалоге можно просто вызвать требуемой другой диалог, ввести в него значения, закрыть и продолжить работать.
Пример: редактируются опции объекта "сила" (да, того самого). Пользователю нужно определить на какие др. объекты эта сила воздействует. Объектов сотни и больше, уникальность их (пользовательских) имен не поддерживается, да и трудновато по имени найти кто есть кто. В то же время у него практически всегда открыто до 4-х окон где желаемые объекты прекрасно видны. Напоминаю что все немодально.
Записан
RoulanD
Гость
« Ответ #8 : Апрель 28, 2011, 15:55 »

Много всего написано, лучше бы вы конечно схемку кинули что вы хотите.
По поводу модальности:
void setWindowModality(Qt::WindowModality windowModality)
По поводу "т.е. оно не модально, но не может быть никем перекрыто":
void setWindowFlags ( Qt::WindowFlags type )
с помощью этой функции можно делать окно по верх всех окон
Qt::WindowStaysOnTopHint - вот этот флаг по моему.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Апрель 29, 2011, 10:32 »

Много всего написано, лучше бы вы конечно схемку кинули что вы хотите.
По поводу модальности:
void setWindowModality(Qt::WindowModality windowModality)
По поводу "т.е. оно не модально, но не может быть никем перекрыто":
void setWindowFlags ( Qt::WindowFlags type )
с помощью этой функции можно делать окно по верх всех окон
Qt::WindowStaysOnTopHint - вот этот флаг по моему.
Ну повторить Assistant конечно никогда не мешает, но вопрос был не об этом  Улыбающийся
Записан
RoulanD
Гость
« Ответ #10 : Апрель 29, 2011, 16:24 »

Тогда схемку =)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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