Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: panAlexey от Ноябрь 14, 2011, 11:55



Название: MDI интерфейс, несколько типов документов с одинаковыми коммандами, как разделит
Отправлено: panAlexey от Ноябрь 14, 2011, 11:55
MDI интерфейс, несколько типов документов с одинаковыми коммандами, как разделить?
есть несколько редакторов: простой текст и рич текст, редактор форм, xml редактор.
есть общие для этих редакторов команды: Сейв, Ундо, редо, поиск и т.п.
если соединить напрямую сигналами, то при нажатии на акшин команда будет срабатывать во всех активных.
но это неправильно.
есть вариант связать акцию со слотом в главном окне, а потом определять активное окно и посылать сигнал конкретно ему.
может есть еще варианты?


Название: Re: MDI интерфейс, несколько типов документов с одинаковыми коммандами, как разделит
Отправлено: panAlexey от Ноябрь 14, 2011, 11:56
Пробовал использовать qmdilib, но она глючная и я от нее избавляюсь.
Хотелось бы как то автоматизировать и построение меню и панелей пиктограмм.
Подскажите?


Название: Re: MDI интерфейс, несколько типов документов с одинаковыми коммандами, как разделит
Отправлено: panAlexey от Ноябрь 14, 2011, 17:49
Ап. тема горит.


Название: Re: MDI интерфейс, несколько типов документов с одинаковыми коммандами, как разделит
Отправлено: Denis.Rassvetniy от Ноябрь 19, 2011, 19:26
Мой дилетантский совет:
создайте какой-нибудь ActionManager, который будет определять активный редактор и вызывать его методы save(), cut(), copy(), etc. Экшены соединяйте с этим менеджером.

А вообще хотелось бы услышать мнение профессионалов.


Название: Re: MDI интерфейс, несколько типов документов с одинаковыми коммандами, как разделит
Отправлено: asvil от Ноябрь 19, 2011, 20:57
Я делал actionmanager, который отслеживал текущее фокусное окно, и в зависимости от наличия в этом окне слотов cut, copy, paste, undo, redo включал/выключал соответсвующие actions. кроме того после этого данный менеджер сигнал triggered соединял со одноименным слотом фокусного виджета.
Для редактирования текста сойдет, для tableview уже надо наследовать tableview со всеми вытекающими.
могу выложить исходик, который может быть использован примерно так:

Код:
am = new ActionManager();
am.addWidget(editMenu);
am.addWidget(editToolBar);


Название: Re: MDI интерфейс, несколько типов документов с одинаковыми коммандами, как разделит
Отправлено: Авварон от Ноябрь 20, 2011, 01:31
Я уже где-то рассказывал тут... Я делал так - есть экшны в менюшках, с дефолтными текстом, иконкой, шорткатом. У них есть ид (например для копи "action.copy"). И есть экшны в виджетах, каждый зарегистрирован в экшн менеджере с определенным айдишником (к примеру, ид экшна копирования должен совпадать с ид экшна копирования в меню - "action.copy"). При переключении фокуса и/или скрытии/показывании виджета его экшны связываются с экшнами в меню - при триггеринге экшна в меню триггерится экшн в виджете и наоборот; при смене текста/иконки/шортката экшна в виджете меняется текст/иконка/шорткат экшна в меню. Это позволяет делать не только стандартные экшны типа копи/паст/анду/реду, но и менять текст экшна меню в зависимости от виджета в фокусе (полезно для анду/реду), а также состояние всех экшнов виджета остается консистентным с виджетом.

Схема подсмотрена в Qt Creator'e, но там чуть по-другому (экшны не привязаны к виджетам, а привязаны к определенному классу - ручками определяется какой виджет текущий и ручками поддерживается консистентное состояние экшнов и текущего виджета)


Название: Re: MDI интерфейс, несколько типов документов с одинаковыми коммандами, как разделит
Отправлено: panAlexey от Ноябрь 20, 2011, 13:47
Схема подсмотрена в Qt Creator'e, но там чуть по-другому (экшны не привязаны к виджетам, а привязаны к определенному классу - ручками определяется какой виджет текущий и ручками поддерживается консистентное состояние экшнов и текущего виджета)
Приблизительно так и сделал.
QAction  в главном окне, мидичилды наследуются от uoAbstractMDIChild, а у него есть
    virtual void onActivate(QMainWindow* mWnd ) = 0;
    virtual void onDeactivate(QMainWindow* mWnd ) = 0;
    bool isActiveMdiWindow(QWidget* wi);

в onActivate чилд добавляет свои менюхи в QMainWindow.