crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
Litkevich Yuriy
  опции профиля:
сообщение 31.7.2010, 18:42
Сообщение #1


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

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

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




Репутация:   94  


Не могу понять как создать вложенное действие (подменю)

Есть указатель на QAction, например:
QAction *createSubAction(QAction *action, const QString &newaction)
{
...
}
Нужно что бы функция сделала, для входного "действия" выпадающее меню с пунктом newaction и вернула указатель на "действие" ассоциированное с этим пунктом.
Схема меню:
пункт1
пункт2
action.text() > newaction
пункт3

где:
action.text() - существующий пункт меню, к которому требуется добавить подменю
newaction - вновь созданный пункт подменю
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.7.2010, 18:59
Сообщение #2


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

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

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




Репутация:   34  


А вот это разве не оно ?
Цитата
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
  опции профиля:
сообщение 31.7.2010, 19:17
Сообщение #3


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

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

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




Репутация:   94  


И?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.7.2010, 19:20
Сообщение #4


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

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

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




Репутация:   34  


А что И )
QAction *createSubAction(const QAction *action, const QString &newaction)
{
   return action->menu()->addAction ( newaction );
}


(но не проверял)

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


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

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

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




Репутация:   94  


это ты просто создаёшь новый пункт в меню, а мне нужно вложенное меню создать.

Здаётся мне, что в Qt это очередная не решаемая задача, среди, казалось бы, простейших
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.7.2010, 20:18
Сообщение #6


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

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

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




Репутация:   34  


Ещё мысль (по аналогии с тем, как это делается в WinAPI)

создать объект QMenu, вставить в него пункты, а затем присобачить это меню к действию методом
void QAction::setMenu ( QMenu * menu )

И это действие добавить как очередной пункт родительского меню


Собственно, что и требовалось доказать
    QAction* pAsub=0;    
    QMenu& m=*new QMenu(this);
    m.addAction("1");
    pAsub=m.addAction("2");
    m.addAction("3");
        
    QMenu& m2=*new QMenu(&m);
    m2.addAction("11");
    m2.addAction("22");
    m2.addAction("33");
    pAsub->setMenu(&m2);
    
    m.popup(QPoint(0,0));



(блин, не пойму, как картинку вставить в пост)

Сообщение отредактировал Алексей1153 - 31.7.2010, 20:27
Прикрепленные файлы
Прикрепленный файл  sub.zip ( 953 байт ) Кол-во скачиваний: 164
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.7.2010, 20:42
Сообщение #7


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

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

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




Репутация:   94  


Цитата(Алексей1153 @ 1.8.2010, 0:18) *
QMenu& m=*new QMenu(this);
не понятно за чем вся эта химия с ссылками и указателями
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.7.2010, 20:48
Сообщение #8


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

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

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




Репутация:   34  


со ссылками приятнее работать , точка меньше загромождает код, чем стрелка :) А так разницы нет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.7.2010, 20:52
Сообщение #9


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

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

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




Репутация:   94  


Цитата(Алексей1153 @ 1.8.2010, 0:18) *
И это действие добавить как очередной пункт родительского меню
пункт уже есть. Схема меню:
Было:

пункт1
пункт2
action.text()
пункт3

Стало:

пункт1
пункт2
action.text() > newaction
пункт3



Цитата(Алексей1153 @ 1.8.2010, 0:48) *
со ссылками приятнее работать , точка меньше загромождает код
ничуть, напиши тоже самое в более естественной форме и сравни.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.7.2010, 20:54
Сообщение #10


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

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

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




Репутация:   34  


Ну так ведь доступ к action есть ?
пункт1
пункт2
action.setMenu(&m2);
пункт3


Или я что-то не понимаю...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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


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

Группа: Участник
Сообщений: 2943
Регистрация: 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


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

Группа: Участник
Сообщений: 2943
Регистрация: 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


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

Группа: Участник
Сообщений: 2943
Регистрация: 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.7.2010, 22:25
Сообщение #21


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

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

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




Репутация:   34  


DEADHUNT, ну это уже не суть важно. А чем быстрее то , кстати?

В любом случае, на скорость тут пофиг )) Чай меню, а не миллисекундные точности

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


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

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

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




Репутация:   2  


а что хэш таблица медленнее идеально сбалансированного дерева(с временной сложностью поиска O(log n) )?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.7.2010, 22:32
Сообщение #23


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

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

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




Репутация:   34  


При таком небольшом размере списка - сомневаюсь :) Хеш ещё и посчитать надо. Но это уже оффтоп, я ж говорю - скорость тут фигня, не заметишь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 31.7.2010, 22:36
Сообщение #24


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

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

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




Репутация:   2  


вычисление хэша наверняка не будет выполняться дольше чем сравнивается QString(а их будет O(log n) ).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.7.2010, 22:41
Сообщение #25


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

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

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




Репутация:   34  


DEADHUNT, обрати внимание на количество элементов :) А сравнение двух строк - это одна цепочечная машинная команда, если удачно соптимизируется. Опять оффтоп )) Увязнем в теории, которая тут ни к чему

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


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

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

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




Репутация:   94  


Накидал класс YAction, наследник QAction поддерживающий иерархию.
Прикрепленный файл  YAction.zip ( 959 байт ) Кол-во скачиваний: 171


применять легко:
QAction *addItem(const QString &menuPath)
{
    const QStringList items = menuPath.split("/");
    QAction *action = 0;
    for(int i = 0; i != items.size(); ++i){
        if (!action){
            action = new YAction(items.at(i), menuBar);
        }else{
            action = new YAction(items.at(i), action);
        }
    }
    return action;
}
menuBar - где-то объявлен.

П.С.
писалось только-что (без двадцати минут 4 утра) ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.8.2010, 12:30
Сообщение #27


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

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

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




Репутация:   94  


Сообщение переместил сюда: Секреты и интересные возможности Qt
(В копилку так сказать)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 1.8.2010, 17:08
Сообщение #28


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

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

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




Репутация:   34  


Хм, надо тогда более детально протестировать будет :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.8.2010, 17:18
Сообщение #29


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

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

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




Репутация:   94  


копилку эту разобрать бы, да в вики перенести. Да что-то никак с силами не соберусь. Может, кто-то возьмётся
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 17.6.2025, 3:06