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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Портирование меню  (Прочитано 4585 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Май 08, 2014, 13:25 »

Добрый день

Нативное приложение работает с главным меню примерно так
Код
C++ (Qt)
struct MenuItem {
MenuItem * mParent, * mPrev, * mNext;
const char * mName;   // item's name
int flags;  // enabled, checked etc
CallbackProc proc;
...
};
 
// RebuildMenu замещает все меню (от корня) на новое
void RebuildMenu( MenuItem * root );  
 
// AdjustMenu пробегается по всему дереву и синхронизирует каждый айтем (изменился текст и/или флаги)
void AdjustMenu( MenuItem * root );  
 
Напр случилось что-то в приложении (напр открылось новое окно), вызывается AdjustMenu которое вызовет для каждого айтема CallbackProc, а она решит делать ли этот айтем enabled/checked, как может изменить имя и.т.п. и вызовет нативную ф-цию для обновления UI.  

Как срастить это все с Qt? Стоит ли выбросить старые структуры? Если нет то как увязать их с QAction?

Спасибо
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #1 : Май 08, 2014, 14:30 »

QAction * QMenu::menuAction() const
QMenu * QAction::menu() const
QList<QAction *> QWidget::actions() const

этого должно хватить чтобы встроиться в текущую иерархию
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Май 08, 2014, 16:29 »

этого должно хватить чтобы встроиться в текущую иерархию
Т.е. Вы предлагаете текущие структуры данных сохранить. Тогда как встраиваться. Напр чтобы изменить имя/атрибуты QAction нужно видеть MenuItem и.т.п. Кто кого и как наследует (или является членом) - вот это я хочу пообсуждать
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #3 : Май 08, 2014, 18:18 »

экшен-родитель данного экшена: action->menu()->menuAction() (проверки на 0 опущены)

содержится ли данный экшен в данном меню: menu->actions().contains(action)

следующий/предыдущий опрашиваются из action->menu()->actions() (или заполняются при создании, не знаю как в коде организовано)

я правильно понял вопрос?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Май 09, 2014, 09:32 »

следующий/предыдущий опрашиваются из action->menu()->actions() (или заполняются при создании, не знаю как в коде организовано)

я правильно понял вопрос?
Не совсем. Никаких QAction у меня пока нет - мне еще надо их построить. Как при этом мне задействовать существующую структуру дерева? Напр если QAction выдаст сигнал - надо как-то вызвать callback из MenuItem, а где его взять?

Тут еще одна интересная вещь всплыла. Оказывается приложение не обновляет меню немедленно. Делается так:

- если мышь нажата в меню баре (или нажата клавиша  hotkey menu) - тогда вызывается AdjustMenu которая пробежится по всем айтемам и установит их состояние.

Пока не знаю плохо это или хорошо  Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #5 : Май 09, 2014, 13:07 »

я думал просто превратить MenuItem в следующую структуру:
Код
C++ (Qt)
struct MenuItem {
MenuItem * mParent, * mPrev, * mNext;
QAction *mAction;
...
};

по идее меню айтему не нужно знать свой коллбэк — этим занимается «контроллер» (тот кто коллбэк и присваивает, или вызывает connect). как кстати сейчас объявлен CallbackProc ? как указатель на функцию?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Май 12, 2014, 11:42 »

по идее меню айтему не нужно знать свой коллбэк — этим занимается «контроллер» (тот кто коллбэк и присваивает, или вызывает connect). как кстати сейчас объявлен CallbackProc ? как указатель на функцию?
Да. Точнее там даже 2 callback'а (один - само действие, второй - установка атрибутов)

я думал просто превратить MenuItem в следующую структуру:
Код
C++ (Qt)
struct MenuItem {
MenuItem * mParent, * mPrev, * mNext;
QAction *mAction;
...
};
Ну а что я этим достигаю? Допустим пришел сигнал от QAction, где взять MenuItem чтобы позвать его callback?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Май 12, 2014, 11:59 »

Отнаследовать MenuItem от QAction
либо
QAction::setData( QVariant::fromValue<MenuItem* > )
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Май 12, 2014, 13:06 »

Отнаследовать MenuItem от QAction
либо
QAction::setData( QVariant::fromValue<MenuItem* > )
Тут такая "мелкая пакость" - MenuIten существует и для суб-менюшек, тогда menu->menuAction() не даст мне наследника
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Май 12, 2014, 13:12 »

Тут такая "мелкая пакость" - MenuIten существует и для суб-менюшек, тогда menu->menuAction() не даст мне наследника
Хм.., чего-то не догоняю - ведь какой создашь QAction, тот и получишь.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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