Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Май 08, 2014, 13:25



Название: Портирование меню
Отправлено: Igors от Май 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?

Спасибо


Название: Re: Портирование меню
Отправлено: kambala от Май 08, 2014, 14:30
QAction * QMenu::menuAction() const
QMenu * QAction::menu() const
QList<QAction *> QWidget::actions() const

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


Название: Re: Портирование меню
Отправлено: Igors от Май 08, 2014, 16:29
этого должно хватить чтобы встроиться в текущую иерархию
Т.е. Вы предлагаете текущие структуры данных сохранить. Тогда как встраиваться. Напр чтобы изменить имя/атрибуты QAction нужно видеть MenuItem и.т.п. Кто кого и как наследует (или является членом) - вот это я хочу пообсуждать


Название: Re: Портирование меню
Отправлено: kambala от Май 08, 2014, 18:18
экшен-родитель данного экшена: action->menu()->menuAction() (проверки на 0 опущены)

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

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

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


Название: Re: Портирование меню
Отправлено: Igors от Май 09, 2014, 09:32
следующий/предыдущий опрашиваются из action->menu()->actions() (или заполняются при создании, не знаю как в коде организовано)

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

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

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

Пока не знаю плохо это или хорошо  :)


Название: Re: Портирование меню
Отправлено: kambala от Май 09, 2014, 13:07
я думал просто превратить MenuItem в следующую структуру:
Код
C++ (Qt)
struct MenuItem {
MenuItem * mParent, * mPrev, * mNext;
QAction *mAction;
...
};

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


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

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


Название: Re: Портирование меню
Отправлено: GreatSnake от Май 12, 2014, 11:59
Отнаследовать MenuItem от QAction
либо
QAction::setData( QVariant::fromValue<MenuItem* > )


Название: Re: Портирование меню
Отправлено: Igors от Май 12, 2014, 13:06
Отнаследовать MenuItem от QAction
либо
QAction::setData( QVariant::fromValue<MenuItem* > )
Тут такая "мелкая пакость" - MenuIten существует и для суб-менюшек, тогда menu->menuAction() не даст мне наследника


Название: Re: Портирование меню
Отправлено: GreatSnake от Май 12, 2014, 13:12
Тут такая "мелкая пакость" - MenuIten существует и для суб-менюшек, тогда menu->menuAction() не даст мне наследника
Хм.., чего-то не догоняю - ведь какой создашь QAction, тот и получишь.