MDI/QWorkspace+разные типы документов., Как правильно спроектировать? |
Здравствуйте, гость ( Вход | Регистрация )
MDI/QWorkspace+разные типы документов., Как правильно спроектировать? |
trdm |
10.2.2008, 23:53
Сообщение
#1
|
Дмитрий Трошин Группа: Участник Сообщений: 575 Регистрация: 12.1.2008 Пользователь №: 68 Спасибо сказали: 21 раз(а) Репутация: 6 |
Планирую сделать множество разных "документов" в смысле управляемых QWorkspace дочерних окон,
в которых будет разнородное содержимое: текст, формы разных типов, таблицы. Каждый из типов документов имеет свои уникальные действия. У некоторых документов есть даже свои менюшки 1-го уровня и панели инструментов. В смысле не одна а несколько. как мне правильно архитектурно скомпоновать их в интерфейс? есть ли примеры, которые можно посмотреть? зарезервировать в главном меню максимальное количество возможных меню и при смене активного чилда перестраивать менюшку? Как быть со стандартными акциями типа "ЗАписать", "Вырезать", "вставить", "Поиск" и т.п. Сделать абстрактный класс МидиЧилд, добавить в него политики, типа // политика доступности определенных действий для документов // т.е. действие доступно: Всегда, Никогда, Запрос на доступность. typedef enum _docActionPolicy { actPolisyAlways , actPolisyNever , actPolisyAsk } docActionPolicy; в базовом заглушить их, а в наследнике разрешать только доступные/реализованные? Вобщем кучка вопросов, на которых непонятно как правильно ответить ( Поможете? |
|
|
trdm |
11.2.2008, 0:17
Сообщение
#2
|
Дмитрий Трошин Группа: Участник Сообщений: 575 Регистрация: 12.1.2008 Пользователь №: 68 Спасибо сказали: 21 раз(а) Репутация: 6 |
Или ввести в базовый виртуальную функцию типа: bool MdiChild::docPolicyHelper(docPolicyEnumerator searchPolicy),
Которая сама должна ответить на вопрос о стандартных акциях, доступно ли? |
|
|
trdm |
11.2.2008, 1:11
Сообщение
#3
|
Дмитрий Трошин Группа: Участник Сообщений: 575 Регистрация: 12.1.2008 Пользователь №: 68 Спасибо сказали: 21 раз(а) Репутация: 6 |
Или ввести в базовый виртуальную функцию типа: bool MdiChild::docPolicyHelper(docPolicyEnumerator searchPolicy), Которая сама должна ответить на вопрос о стандартных акциях, доступно ли? так с политиками управления "стандартными акциями" для разных документов разобрался через "docPolicyHelper". Удобно получилось и интерфейс живой и настраивается легко и прехватить есть где. А вот как быть с дополнительными панелями инструментов и менюшками, зависимыми от типов документов пока не вкурю как сделать ((( ПС. вообще нравится мне QT, очень легко программируется, и свободно как-то не то что в MFC. Сообщение отредактировал trdm - 11.2.2008, 1:14 |
|
|
Litkevich Yuriy |
11.2.2008, 8:07
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
У тебя нет книжки "Патерны объектно-ориентированного проектирования" Э.Гамма и др.?
Там рассматривается пример создания тектового редактора Lexi, может быть это то что тебе нужно, я чесно говоря мельком посмотрел. Сообщение отредактировал Litkevich Yuriy - 11.2.2008, 8:08 |
|
|
ViGOur |
11.2.2008, 10:53
Сообщение
#5
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
А вот как быть с дополнительными панелями инструментов и менюшками, зависимыми от типов документов пока не вкурю как сделать ((( Создаешь класс, общий для всех меню, от него делаешь производными дополнительные классы, а потом на лету меняешь менюшки. Тоже самое для панелей инструментов.Главное создавать меню и панели инструментов не в QDesigner, а динамически, во время выполнения, примерно так: Создание пунктов меню, на лету. |
|
|
trdm |
11.2.2008, 12:52
Сообщение
#6
|
Дмитрий Трошин Группа: Участник Сообщений: 575 Регистрация: 12.1.2008 Пользователь №: 68 Спасибо сказали: 21 раз(а) Репутация: 6 |
Создаешь класс, общий для всех меню, от него делаешь производными дополнительные классы, а потом на лету меняешь менюшки. Тоже самое для панелей инструментов. Главное создавать меню и панели инструментов не в QDesigner, а динамически, во время выполнения, примерно так: Создание пунктов меню, на лету. Не совсем то, что надо. Опишу поподробнее. Есть главное окно, экземпляр QMainWindow, "внутри" QWorkspace. У производный от QMainWindow есть свое главное меню: 1-й уровень: Файл, ...., Сервис, Окна, Справка. Так вот нужно при активации определенного вида документа добавлять в гл. меню QMainWindow специальные менюшки "вида активного документа" в место "...,". То же самое и с панелями. Как это правильно архитектурно сделать? Создавать панели и меню на лету, тут проблем нет. Сообщение отредактировал trdm - 11.2.2008, 12:53 |
|
|
ViGOur |
11.2.2008, 13:49
Сообщение
#7
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Как вариант можно заморочиться с setMenuBar , а именно устанавливать свое меню при активизации документа и возвращать назад при уничтожении...
|
|
|
trdm |
11.2.2008, 14:12
Сообщение
#8
|
Дмитрий Трошин Группа: Участник Сообщений: 575 Регистрация: 12.1.2008 Пользователь №: 68 Спасибо сказали: 21 раз(а) Репутация: 6 |
Как вариант можно заморочиться с setMenuBar , а именно устанавливать свое меню при активизации документа и возвращать назад при уничтожении... В смысле? А как с фиксированными менюшками, которые доступны при любом активном документе или без них? Мне их в каждый документ лепить? Короче не выход. Да тут еще один момент, нет смысла создавать в каждом экземпляре документа меню, зато есть смысл хранить аскции и меню в самом экземпляре QMainWindow. Сообщение отредактировал trdm - 11.2.2008, 14:18 |
|
|
ViGOur |
11.2.2008, 14:18
Сообщение
#9
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Угу, но из одной общей для всех функции члена.
Или как еще один вариант, можно сделать два слота, в которых при активизации документа добавляется твое меню, а при уничтожении удаляется. Соответственно правильно выбрав для этого сигналы и в качестве переменных передающих нужные тебе меню... |
|
|
trdm |
11.2.2008, 14:43
Сообщение
#10
|
Дмитрий Трошин Группа: Участник Сообщений: 575 Регистрация: 12.1.2008 Пользователь №: 68 Спасибо сказали: 21 раз(а) Репутация: 6 |
Угу, но из одной общей для всех функции члена. Или как еще один вариант, можно сделать два слота, в которых при активизации документа добавляется твое меню, а при уничтожении удаляется. Соответственно правильно выбрав для этого сигналы и в качестве переменных передающих нужные тебе меню... не, бяка неуправляемая получается. Мне тут опыт раскопок в сцинтиле кое что пришептал. Возможно лучше сделать так: Создать статический класс менеджер документов, при добавлении класса документа в программу в конце реализации каждого класса документа раелизовать функцию отдающую в менеджеру след. информацию: - Количество доп. менюшек, затребованных классом - количество панелей, затребованных классом. - количество акций, затребованных классом. - расширения файлов обрабатываемых классом и т.п. при создании главного окна уже будет информация, нужная для формирования главного меню и панелей инструментов. хотя картинка в целом не ясна еще, но думаю это правильный путь, который обеспечит мне гибкость. |
|
|
Текстовая версия | Сейчас: 21.12.2024, 20:13 |