Название: Как узнать, какой пункт меню был выбран? Отправлено: Fregloin от Июня 23, 2011, 14:30 Формируется главное меню окна динамически.
К примеру, есть несколько клиентов, для каждого клиента свой пункт меню. Все пункты меню нужно привязать к одному слоту этого окна, в котором нужно произвести некоторые предварительные настройки программы, а затем обратиться к конкретному клиенту. Как это сделать? Название: Re: Как узнать, какой пункт меню был выбран? Отправлено: LisandreL от Июня 23, 2011, 14:43 В слоте через sender() узнать, кто его вызвал и выполнять нужные действия.
Название: Re: Как узнать, какой пункт меню был выбран? Отправлено: Fregloin от Июня 23, 2011, 17:13 sender у кого брать?
Название: Re: Как узнать, какой пункт меню был выбран? Отправлено: kambala от Июня 23, 2011, 17:35 просто вызываешь sender() - он определён во всех классах-наследниках QObject. если слот mySlot() вызывается при нажатии на команду меню, то код будет примерно таким:
Код
Название: Re: Как узнать, какой пункт меню был выбран? Отправлено: Denjs от Июня 23, 2011, 17:48 В слоте через sender() узнать, кто его вызвал и выполнять нужные действия. это не совсем хороший путь. Будет работать не для всех типов соединения (как я понимаю только для Qt::DirectConnection), и только в рамках одного потока. При Qt::QueuedConnection или когда источник и приемник находятся в разных потоках - в общем случае - объект-источник может быть уже уничтожен к моменту, когда сигнал будет доставлен. Соответсвенно никакого "валидного" sender вы не получите. Для сигналов с "пустой сигнатурой" (вида "clicked()") используйте QSignalMapper - он переиспускает полученный сигнал со строкой идентифицирующей тот или иной источник к нему подключенный т.е. (сигнал "clicked()" становится "activated(QString mySourceString)"). Название: Re: Как узнать, какой пункт меню был выбран? Отправлено: LisandreL от Июня 23, 2011, 20:07 это не совсем хороший путь. Это совсем хороший путь, просто со своей областью применения, зато в чём-то и более функциональный в смысле возможности предачи данных.Поскольку всё будет работать в одном потоке, Qt::DirectConnection вполне применим и будет использоваться по умолчанию, если не указать иное (привязывается «пункт меню» к «слоту окна», а так как весь гуй обязан жить в одном потоке, то у источника и приёмника будет один поток). Название: Re: Как узнать, какой пункт меню был выбран? Отправлено: Igors от Июня 23, 2011, 21:49 По ходу дела вопрос - а как в подходящий момент получить управление чтобы сделать выбор меню enabled/disabled в зависимости от контекста? Напр. если у меня файл еще не открыт - то "Save" в меню должно быть greyed/disabled
Please "ткните носиком" на нужную страницу Assistant :) Название: Re: Как узнать, какой пункт меню был выбран? Отправлено: twp от Июня 23, 2011, 22:47 у борландов, насколько я помню, есть такая возможность. В Qt это не реализовано, так что все это нужно делать самому. Самое просто это сделать один метод или слот типа updateStateActions и в нем устанавливать доступность/недоступность всего меню и дергать этот метод после некоторых операций
Название: Re: Как узнать, какой пункт меню был выбран? Отправлено: Авварон от Июня 23, 2011, 23:14 Ща сам с этим гемороюсь:) А ткните носом в доку дельфятников, может у них есть что-то приличное?
Название: Re: Как узнать, какой пункт меню был выбран? Отправлено: twp от Июня 23, 2011, 23:54 в Делфи по идее вот это (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/ActnList_TActionList_OnUpdate.html)
Название: Re: Как узнать, какой пункт меню был выбран? Отправлено: Авварон от Июня 24, 2011, 02:54 в общем фигня, решается сигналом modifictionChanged(bool) в документе. Я думал там че-то умное...
Название: Re: Как узнать, какой пункт меню был выбран? Отправлено: GreatSnake от Июня 24, 2011, 09:32 в общем фигня, решается сигналом modifictionChanged(bool) в документе. Я думал там че-то умное... это-то здесь причём ???Название: Re: Как узнать, какой пункт меню был выбран? Отправлено: GreatSnake от Июня 24, 2011, 09:43 Через QAction::setData() вешаем на элемент меню указатель на клиента:
Код
и уже в слоте получаем clientWidget: Код
Название: Re: Как узнать, какой пункт меню был выбран? Отправлено: GreatSnake от Июня 24, 2011, 10:04 По ходу дела вопрос - а как в подходящий момент получить управление чтобы сделать выбор меню enabled/disabled в зависимости от контекста? Напр. если у меня файл еще не открыт - то "Save" в меню должно быть greyed/disabled Поисследовав исходники троллей понял, что QMenu они считают довольно-таки лёгким ресурсом и создают его только при нажатии на правую кнопку.Поэтому заполнять само контекстное меню, "серить" его элементы и "исполнять" можно довольно-таки просто и линейно: Код
Название: Re: Как узнать, какой пункт меню был выбран? Отправлено: Fregloin от Июня 24, 2011, 12:00 спасибо, буду пробовать!
|