crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Создание вложенного действия QAction
DEADHUNT
  опции профиля:
сообщение 31.7.2010, 21:08
Сообщение #11


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


а почему подменю нельзя так добавить QMenu::addMenu, зачем что придумывать для QAction?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.7.2010, 21:10
Сообщение #12


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Алексей1153 @ 1.8.2010, 0:18) *
void QAction::setMenu ( QMenu * menu )
в принципе близок к истине. Только прийдётся разруливать повторный вызов функции.

Цитата(DEADHUNT @ 1.8.2010, 1:08) *
QMenu::addMenu, зачем что придумывать для QAction?
потому-что есть только указатель на QAction
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 31.7.2010, 21:15
Сообщение #13


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


Цитата(Litkevich Yuriy @ 31.7.2010, 22:10) *
потому-что есть только указатель на QAction

значит можно удалить QAction, а вместо него вставить QMenu и наоборот если надо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.7.2010, 21:16
Сообщение #14


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(DEADHUNT @ 1.8.2010, 0:08) *
а почему подменю нельзя так добавить QMenu::addMenu, зачем что придумывать для QAction?

тут какая-то интересная иерархия

Вроде бы первично QMenu.
Затем, QMenu содержит список QAction.
....Каждый QAction содержит свой QMenu m , который, если нет подменю, пуст.
........Ну, а QMenu - ... (рекурсивно повторять до талого снега)

А удалить QAction - значит удалить пункт

Сообщение отредактировал Алексей1153 - 31.7.2010, 21:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.7.2010, 21:27
Сообщение #15


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(DEADHUNT @ 1.8.2010, 1:15) *
значит можно удалить QAction, а вместо него вставить QMenu и наоборот если надо.


Цитата(Алексей1153 @ 1.8.2010, 1:16) *
А удалить QAction - значит удалить пункт
не только, ещё и те объекты которые прицеплены к его сигналам, могут стать глухими.


Цитата(Алексей1153 @ 1.8.2010, 1:16) *
Вроде бы первично QMenu.
поидее и QMenu имеет ассоциированный с ним QAction, и является визуальным контейнером QAction'ов. И пункт на панели меню - тоже QAction. Т.е. QAction всему голова. Однако иерархию построить невозможно.


Вообще понадобилась относительно простая вещь. Плагины возвращают строку такого вида:
"Правка/Копировать"
"Правка/Вставить"
"Настройки/Модули/Редактор"

И т.п. плагины могут быть как дочерним окном в MDI, соответственно менюхи должны перестраиваться в зависимости от активного окна. Также плагины могут быть не визуальными но содержать диалоги, поэтому для доступа к диалогам, они просят главное окно создать цепочку пунктов меню. Если часть цепочки существует, то туда просто, что-то добавляется.

Если бы QAction был полноценным классом, эту идею можно было бы довольно легко реализовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 31.7.2010, 21:39
Сообщение #16


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


Цитата(Litkevich Yuriy @ 31.7.2010, 22:27) *
не только, ещё и те объекты которые прицеплены к его сигналам, могут стать глухими.

можно создать список подключенных сигналов, затем их переподключать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.7.2010, 21:44
Сообщение #17


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(Litkevich Yuriy @ 1.8.2010, 0:27) *
поидее и QMenu имеет ассоциированный с ним QAction, и является визуальным контейнером QAction'ов. И пункт на панели меню - тоже QAction. Т.е. QAction всему голова. Однако иерархию построить невозможно.

Ну почему же невозможно, всё вроде стройно: ассоциированный с ним QAction - это собственник этого QMenu , и он (этот ваще-основной QAction) никогда не будет вызван

То есть, схематично будет как-то так:

class QAction
{
   QMenu* pm;
};

class QMenu
{
    QAction* pParentAction;
    vector<QAction> acts;
};


А почему QAction вдруг не полноценный класс ? )) Из исходников Qt:

class Q_GUI_EXPORT QAction : public QObject
{
    Q_OBJECT
    Q_DECLARE_PRIVATE(QAction)
...
...
};


Цитата
"Правка/Копировать"
"Правка/Вставить"
"Настройки/Модули/Редактор"

....они просят главное окно создать цепочку пунктов меню. Если часть цепочки существует, то туда просто, что-то добавляется.


То есть, из текстового описания меню нужно создать свой объект меню с этими пунктами, так ?

Сообщение отредактировал Алексей1153 - 31.7.2010, 21:41
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.7.2010, 21:55
Сообщение #18


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Алексей1153 @ 1.8.2010, 1:44) *
А почему QAction вдруг не полноценный класс ? ))
потомучто не имеет методов:
void setSubActon(QAction *)
QAction *parentAction()
QList<QAction *> childActions()

чтобы получить эту информацию, нужно костылей понаделать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.7.2010, 22:21
Сообщение #19


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


void setSubActon(QAction *) - Скорее должно бы выглядеть так

void setSubActon(QMenu *)

То есть, такой метод уже есть - 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
  опции профиля:
сообщение 31.7.2010, 22:24
Сообщение #20


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


Цитата(Алексей1153 @ 31.7.2010, 23:21) *
Если меню создаётся с нуля, то проще всего вести ассоциативный список map<QString,QAction*>

можно hash map использовать(быстрее будет, в STL std::unordered_map)

Сообщение отредактировал DEADHUNT - 31.7.2010, 22:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 3:03