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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: MDI интерфейс, несколько типов документов с одинаковыми коммандами, как разделит  (Прочитано 3579 раз)
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« : Ноябрь 14, 2011, 11:55 »

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

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #1 : Ноябрь 14, 2011, 11:56 »

Пробовал использовать qmdilib, но она глючная и я от нее избавляюсь.
Хотелось бы как то автоматизировать и построение меню и панелей пиктограмм.
Подскажите?
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #2 : Ноябрь 14, 2011, 17:49 »

Ап. тема горит.
« Последнее редактирование: Ноябрь 14, 2011, 17:55 от panAlexey » Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Denis.Rassvetniy
Гость
« Ответ #3 : Ноябрь 19, 2011, 19:26 »

Мой дилетантский совет:
создайте какой-нибудь ActionManager, который будет определять активный редактор и вызывать его методы save(), cut(), copy(), etc. Экшены соединяйте с этим менеджером.

А вообще хотелось бы услышать мнение профессионалов.
« Последнее редактирование: Ноябрь 19, 2011, 19:28 от Denis.Rassvetniy » Записан
asvil
Гость
« Ответ #4 : Ноябрь 19, 2011, 20:57 »

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

Код:
am = new ActionManager();
am.addWidget(editMenu);
am.addWidget(editToolBar);
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Ноябрь 20, 2011, 01:31 »

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

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

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #6 : Ноябрь 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.
« Последнее редактирование: Ноябрь 20, 2011, 13:50 от panAlexey » Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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