Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Март 18, 2015, 10:53



Название: Меню + модальность
Отправлено: Igors от Март 18, 2015, 10:53
Добрый день

При редактировании текста команды Copy/Paste должны быть enabled в меню - но сделать это не удается если текущее окно модально. Кроме того есть еще парочка hotkeys которая тоже должна быть enabled. На 4.7.4 я делал модальное окно родителем меню бара. Это работает и вроде "легально" - но страшно геморройно и по-разному на Mac и Вындоуз. Поэтому при переходе на 5.4 я этот уродливый код снес (в загажник). Может есть штатные средства?

Спасибо


Название: Re: Меню + модальность
Отправлено: GreatSnake от Март 18, 2015, 11:33
Т.е. Вам хочется, чтобы hot-keys главного окна были доступны в диалоге?


Название: Re: Меню + модальность
Отправлено: Igors от Март 18, 2015, 11:49
Т.е. Вам хочется, чтобы hot-keys главного окна были доступны в диалоге?
Сделать доступность (клавиша работает) не проблема (я помню Ваши советы). Но что с меню? Пример: юзер открывает "Edit" меню, там Copy/Paste серенькие. Нажимает Ctl-V - paste работает. Нехорошо


Название: Re: Меню + модальность
Отправлено: GreatSnake от Март 18, 2015, 11:53
Вы не ответили на вопрос и совсем запутали.
Как юзер может открыть меню главного (?) окна из модального?


Название: Re: Меню + модальность
Отправлено: Igors от Март 18, 2015, 12:43
Вы не ответили на вопрос и совсем запутали.
Ответ на вопрос: да, я хочу чтобы несколько команд меню были доступны и из модальных диалогов и работали как по клавише, так и из меню

Как юзер может открыть меню главного (?) окна из модального?
На OSX одно меню приложения на всех. На Вындоуз считаем что меню тоже всегда одно и принадлежит видимому QMainWindow. Т.е. я всегда создаю один QMenuBar


Название: Re: Меню + модальность
Отправлено: GreatSnake от Март 18, 2015, 12:48
На OSX одно меню приложения на всех. На Вындоуз считаем что меню тоже всегда одно и принадлежит видимому QMainWindow. Т.е. я всегда создаю один QMenuBar
Но это совершенно не означает, что модальное окно должно быть в контексте главного окна.
Именно модальность перекрывает этот контекст.
Делайте такое окно панелью (QDockWidget), но никак не модальным.


Название: Re: Меню + модальность
Отправлено: Igors от Март 18, 2015, 13:35
Но это совершенно не означает, что модальное окно должно быть в контексте главного окна.
Именно модальность перекрывает этот контекст.
То моя забота задизаблить или скрыть все айтемы меню которые не имеют отношения к диалогу.

Делайте такое окно панелью (QDockWidget), но никак не модальным.
Модальных диалогов много, и многие из них имеют текстовые поля. Все на QDockWidget точно не переделать. А снабжать каждое куцей менюхой из неск айтемов - несерьезно.


Название: Re: Меню + модальность
Отправлено: GreatSnake от Март 18, 2015, 13:44
Модальных диалогов много, и многие из них имеют текстовые поля. Все на QDockWidget точно не переделать. А снабжать каждое куцей менюхой из неск айтемов - несерьезно.
Притягивать меню главного окна к диалогу, имхо, хак, да и зачем ???

P.S. Ещё раз повторю. Модальный диалог имеет свой, отличных от других контекст.
Своими сомнительными действиями Вы нарушаете целостность GUI и можете сконфузить пользователя.
Мало того, на других DE есть темы, в которых при появлении модального окна, основное окно затеняется.


Название: Re: Меню + модальность
Отправлено: Igors от Март 18, 2015, 14:46
Ладно, давайте оставим "идеологическую плоскость" и посмотрим как сделано в Qt
Код
C++ (Qt)
bool QCocoaMenuBar::shouldDisable(QCocoaWindow *active) const
{
   if (active && (active->window()->modality() == Qt::NonModal))
       return false;
 
   if (m_window == active) {
       // modal window owns us, we should be enabled!
       return false;
   }
 
   QWindowList topWindows(qApp->topLevelWindows());
   // When there is an application modal window on screen, the entries of
   // the menubar should be disabled. The exception in Qt is that if the
   // modal window is the only window on screen, then we enable the menu bar.
   foreach (QWindow *w, topWindows) {
       if (w->isVisible() && w->modality() == Qt::ApplicationModal) {
           // check for other visible windows
           foreach (QWindow *other, topWindows) {
               if ((w != other) && (other->isVisible())) {
                   // INVARIANT: we found another visible window
                   // on screen other than our modalWidget. We therefore
                   // disable the menu bar to follow normal modality logic:
                   return true;
               }
           }
 
           // INVARIANT: We have only one window on screen that happends
           // to be application modal. We choose to enable the menu bar
           // in that case to e.g. enable the quit menu item.
           return false;
       }
   }
 
   return true;
}
 
Опять парента перебрасывать - ну капитальный невдобняк  :'(


Название: Re: Меню + модальность
Отправлено: Igors от Март 18, 2015, 14:51
Притягивать меню главного окна к диалогу, имхо, хак, да и зачем ???
Основная платформа Mac, а там всегда было одно меню на все приложение. Поэтому если hotkeys не отражены в меню - выглядит как явный баг. И меню должно подмигивать если hotkey сработал. А Вындоуз перетопчется, невелика цаца

Edit: вот скриншотик как это выглядит