Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Апрель 28, 2011, 09:38



Название: Режим выбора
Отправлено: Igors от Апрель 28, 2011, 09:38
Добрый день

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

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

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

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

Какие есть подходы?
Спасибо


Название: Re: Режим выбора
Отправлено: GreatSnake от Апрель 28, 2011, 10:15
Без схемы/рисунка/скриншота как-то трудно представить ситуацию.


Название: Re: Режим выбора
Отправлено: SABROG от Апрель 28, 2011, 10:23
Без схемы/рисунка/скриншота как-то трудно представить ситуацию.

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

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


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

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


Название: Re: Режим выбора
Отправлено: GreatSnake от Апрель 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 );
}
 


Название: Re: Режим выбора
Отправлено: SABROG от Апрель 28, 2011, 11:06
- в одном из окон нарисован круг. В "нормальном" режиме пользователь может выбрать его и тащить мышей. В режиме выбора - только выбрать. На этом режим выбора может закончиться (и имя выбранного круга появится в окне из которого начинали) или продолжаться если выбор "мульти"

Может тогда посмотреть в сторону QStateMachine?


Название: Re: Режим выбора
Отправлено: m_ax от Апрель 28, 2011, 13:14
Цитировать
Есть N НЕмодальных окон. Пользователь может переключаться с одного на другое и вводить данные. Возникают ситуации когда один диалог требует других, напр:

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


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

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

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


Название: Re: Режим выбора
Отправлено: RoulanD от Апрель 28, 2011, 15:55
Много всего написано, лучше бы вы конечно схемку кинули что вы хотите.
По поводу модальности:
void setWindowModality(Qt::WindowModality windowModality)
По поводу "т.е. оно не модально, но не может быть никем перекрыто":
void setWindowFlags ( Qt::WindowFlags type )
с помощью этой функции можно делать окно по верх всех окон
Qt::WindowStaysOnTopHint - вот этот флаг по моему.


Название: Re: Режим выбора
Отправлено: Igors от Апрель 29, 2011, 10:32
Много всего написано, лучше бы вы конечно схемку кинули что вы хотите.
По поводу модальности:
void setWindowModality(Qt::WindowModality windowModality)
По поводу "т.е. оно не модально, но не может быть никем перекрыто":
void setWindowFlags ( Qt::WindowFlags type )
с помощью этой функции можно делать окно по верх всех окон
Qt::WindowStaysOnTopHint - вот этот флаг по моему.
Ну повторить Assistant конечно никогда не мешает, но вопрос был не об этом  :)


Название: Re: Режим выбора
Отправлено: RoulanD от Апрель 29, 2011, 16:24
Тогда схемку =)