![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Litkevich Yuriy |
![]()
Сообщение
#1
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Не могу понять как создать вложенное действие (подменю)
Есть указатель на QAction, например: Нужно что бы функция сделала, для входного "действия" выпадающее меню с пунктом newaction и вернула указатель на "действие" ассоциированное с этим пунктом.Схема меню: пункт1 пункт2 action.text() > newaction пункт3 где: action.text() - существующий пункт меню, к которому требуется добавить подменю newaction - вновь созданный пункт подменю |
|
|
Алексей1153 |
![]()
Сообщение
#2
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
А вот это разве не оно ?
Цитата QMenu * QAction::menu () const Returns the menu contained by this action. Actions that contain menus can be used to create menu items with submenus, or inserted into toolbars to create buttons with popup menus. See also setMenu() and QMenu::addAction(). + Цитата QAction * QMenu::addAction ( const QString & text ) This is an overloaded function. This convenience function creates a new action with text. The function adds the newly created action to the menu's list of actions, and returns it.
Причина редактирования: Используй теги по назначению
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#3
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
И?
|
|
|
Алексей1153 |
![]()
Сообщение
#4
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
А что И )
(но не проверял) Сообщение отредактировал Алексей1153 - 31.7.2010, 19:22 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#5
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
это ты просто создаёшь новый пункт в меню, а мне нужно вложенное меню создать.
Здаётся мне, что в Qt это очередная не решаемая задача, среди, казалось бы, простейших |
|
|
Алексей1153 |
![]()
Сообщение
#6
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Ещё мысль (по аналогии с тем, как это делается в WinAPI)
создать объект QMenu, вставить в него пункты, а затем присобачить это меню к действию методом
И это действие добавить как очередной пункт родительского меню Собственно, что и требовалось доказать
(блин, не пойму, как картинку вставить в пост) Сообщение отредактировал Алексей1153 - 31.7.2010, 20:27
Прикрепленные файлы
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#7
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Алексей1153 |
![]()
Сообщение
#8
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
со ссылками приятнее работать , точка меньше загромождает код, чем стрелка
![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#9
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
И это действие добавить как очередной пункт родительского меню пункт уже есть. Схема меню:Было: пункт1 пункт2 action.text() пункт3 Стало: пункт1 пункт2 action.text() > newaction пункт3 со ссылками приятнее работать , точка меньше загромождает код ничуть, напиши тоже самое в более естественной форме и сравни.
|
|
|
Алексей1153 |
![]()
Сообщение
#10
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Ну так ведь доступ к action есть ?
Или я что-то не понимаю... |
|
|
DEADHUNT |
![]()
Сообщение
#11
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: ![]() ![]() ![]() |
а почему подменю нельзя так добавить QMenu::addMenu, зачем что придумывать для QAction?
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#12
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
DEADHUNT |
![]()
Сообщение
#13
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Алексей1153 |
![]()
Сообщение
#14
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
а почему подменю нельзя так добавить QMenu::addMenu, зачем что придумывать для QAction? тут какая-то интересная иерархия Вроде бы первично QMenu. Затем, QMenu содержит список QAction. ....Каждый QAction содержит свой QMenu m , который, если нет подменю, пуст. ........Ну, а QMenu - ... (рекурсивно повторять до талого снега) А удалить QAction - значит удалить пункт Сообщение отредактировал Алексей1153 - 31.7.2010, 21:19 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#15
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
значит можно удалить QAction, а вместо него вставить QMenu и наоборот если надо. А удалить QAction - значит удалить пункт не только, ещё и те объекты которые прицеплены к его сигналам, могут стать глухими.Вроде бы первично QMenu. поидее и QMenu имеет ассоциированный с ним QAction, и является визуальным контейнером QAction'ов. И пункт на панели меню - тоже QAction. Т.е. QAction всему голова. Однако иерархию построить невозможно.Вообще понадобилась относительно простая вещь. Плагины возвращают строку такого вида: "Правка/Копировать" "Правка/Вставить" "Настройки/Модули/Редактор" И т.п. плагины могут быть как дочерним окном в MDI, соответственно менюхи должны перестраиваться в зависимости от активного окна. Также плагины могут быть не визуальными но содержать диалоги, поэтому для доступа к диалогам, они просят главное окно создать цепочку пунктов меню. Если часть цепочки существует, то туда просто, что-то добавляется. Если бы QAction был полноценным классом, эту идею можно было бы довольно легко реализовать. |
|
|
DEADHUNT |
![]()
Сообщение
#16
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Алексей1153 |
![]()
Сообщение
#17
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
поидее и QMenu имеет ассоциированный с ним QAction, и является визуальным контейнером QAction'ов. И пункт на панели меню - тоже QAction. Т.е. QAction всему голова. Однако иерархию построить невозможно. Ну почему же невозможно, всё вроде стройно: ассоциированный с ним QAction - это собственник этого QMenu , и он (этот ваще-основной QAction) никогда не будет вызван То есть, схематично будет как-то так:
А почему QAction вдруг не полноценный класс ? )) Из исходников Qt:
Цитата "Правка/Копировать" "Правка/Вставить" "Настройки/Модули/Редактор" ....они просят главное окно создать цепочку пунктов меню. Если часть цепочки существует, то туда просто, что-то добавляется. То есть, из текстового описания меню нужно создать свой объект меню с этими пунктами, так ? Сообщение отредактировал Алексей1153 - 31.7.2010, 21:41 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#18
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Алексей1153 |
![]()
Сообщение
#19
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
void setSubActon(QAction *) - Скорее должно бы выглядеть так
То есть, такой метод уже есть - SetMenu ------------------------- QAction * QAction::parentAction() - это относится к QMenu, то есть а это вроде есть тоже Цитата QAction * QMenu::menuAction () const Returns the action associated with this menu. ----------------------------- QList<QAction *> childActions() - это тоже метод меню должОн быть. (аналога не нашёл ![]() --------------------- Если меню создаётся с нуля, то проще всего вести ассоциативный список map<QString,QAction*> Пример содержимого (адреса абстрактные, а ключи - реальные): "Правка/" , 0x1 "Правка/Копировать/" , 0x2 "Правка/Вставить/", 0x3 "Настройки/", 0x4 "Настройки/Модули/", 0x5 "Настройки/Модули/Редактор/", 0x6 А для полного комфорту, возможно, ещё придётся вести эквивалентный список map<QAction*,QString> Сообщение отредактировал Алексей1153 - 31.7.2010, 22:23 |
|
|
DEADHUNT |
![]()
Сообщение
#20
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Алексей1153 |
![]()
Сообщение
#21
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
DEADHUNT, ну это уже не суть важно. А чем быстрее то , кстати?
В любом случае, на скорость тут пофиг )) Чай меню, а не миллисекундные точности Сообщение отредактировал Алексей1153 - 31.7.2010, 22:29 |
|
|
DEADHUNT |
![]()
Сообщение
#22
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: ![]() ![]() ![]() |
а что хэш таблица медленнее идеально сбалансированного дерева(с временной сложностью поиска O(log n) )?
|
|
|
Алексей1153 |
![]()
Сообщение
#23
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
При таком небольшом размере списка - сомневаюсь
![]() |
|
|
DEADHUNT |
![]()
Сообщение
#24
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: ![]() ![]() ![]() |
вычисление хэша наверняка не будет выполняться дольше чем сравнивается QString(а их будет O(log n) ).
|
|
|
Алексей1153 |
![]()
Сообщение
#25
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
DEADHUNT, обрати внимание на количество элементов
![]() Сообщение отредактировал Алексей1153 - 31.7.2010, 22:43 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#26
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Накидал класс YAction, наследник QAction поддерживающий иерархию.
![]() применять легко: menuBar - где-то объявлен.П.С. писалось только-что (без двадцати минут 4 утра) ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#27
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Сообщение переместил сюда: Секреты и интересные возможности Qt
(В копилку так сказать) |
|
|
Алексей1153 |
![]()
Сообщение
#28
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Хм, надо тогда более детально протестировать будет
![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#29
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
копилку эту разобрать бы, да в вики перенести. Да что-то никак с силами не соберусь. Может, кто-то возьмётся
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 17.6.2025, 3:06 |