Над каким виджетом отрабатывает QAction? |
Здравствуйте, гость ( Вход | Регистрация )
Над каким виджетом отрабатывает QAction? |
hkarel |
5.6.2010, 22:17
Сообщение
#1
|
Студент Группа: Участник Сообщений: 25 Регистрация: 25.5.2009 Пользователь №: 771 Спасибо сказали: 0 раз(а) Репутация: 0 |
Имеется два компонента: QTextEdit *te1, *te2. Имеется QAction *act. QAction связан с te1 и te2.
Соответственно в контекстных меню te1 и te2 появляется добавленный act. В свою очередь act имеет связанный слот on_act_triggered(), который отрабатывает при нажатии на пункт меню в обоих QTextEdit. Вопрос: возможно ли определить изнутри on_act_triggered() для какого QTextEdit (te1 или te2) был вызван QAction? |
|
|
Litkevich Yuriy |
6.6.2010, 2:06
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
возможно ли определить изнутри on_act_triggered() для какого QTextEdit (te1 или te2) был вызван QAction? нет.можно попробовать другую реализацию задуманного. Для каждого виджета можно установить политику контекстного меню setContextMenuPolicy(Qt::CustomContextMenu) тогда при щелчке правой кнопкой мыши будет посылаться сигнал customContextMenuRequested соединяешь его со слотом примерно такого вида: Пример можно глянуть в демке demos/qmediaplayer/mediaplayer.cpp
|
|
|
hkarel |
6.6.2010, 21:54
Сообщение
#3
|
Студент Группа: Участник Сообщений: 25 Регистрация: 25.5.2009 Пользователь №: 771 Спасибо сказали: 0 раз(а) Репутация: 0 |
Ну, а что это мне даст? Предлагаете где-то запоминать указатель на текущий виджет, а в on_act_triggered() его использовать? Согласен, это вариант.
Изначально я шел немного по другому пути: изнутри on_act_triggered() возможно определить список QMenu к которым принадлежит act, соответственно QTextEdit тоже определяется без проблем. А вот определить какой из QMenu послужил инициатором события on_act_triggered() у меня не получилось, может где-то доки не дочитал ... Вот если бы как-то можно было это сделать ... |
|
|
Litkevich Yuriy |
6.6.2010, 22:55
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Предлагаете где-то запоминать указатель зачем?в слоте showContextMenu, виджет отправитель сигнала скажет функция sender() возможно ли определить изнутри on_act_triggered() для какого QTextEdit (te1 или te2) был вызван QAction? изнутри on_act_triggered() возможно определить список QMenu к которым принадлежит act, соответственно QTextEdit тоже определяется без проблем что-то тут не сходится
|
|
|
hkarel |
7.6.2010, 9:34
Сообщение
#5
|
Студент Группа: Участник Сообщений: 25 Регистрация: 25.5.2009 Пользователь №: 771 Спасибо сказали: 0 раз(а) Репутация: 0 |
Предлагаете где-то запоминать указатель зачем?в слоте showContextMenu, виджет отправитель сигнала скажет функция sender() Когда я попаду в on_act_triggered() функция showContextMenu уже давно отработает, соответственно ее сендер мне поможет только для запоминания указателя на вызванное меню. Причем если меню будет вложенное, а оно будет таким, то код еще и усложнится отслеживанием иерархии меню. Цитата возможно ли определить изнутри on_act_triggered() для какого QTextEdit (te1 или te2) был вызван QAction? изнутри on_act_triggered() возможно определить список QMenu к которым принадлежит act, соответственно QTextEdit тоже определяется без проблем что-то тут не сходитсяЧему же тут не сходиться? Изначально я сформулировал задачу не приводя своих решений, дабы не задавать конкретного направления. Вы привели еще одно решение. Теперь я пытаюсь понять как его можно использовать, а заодно привожу свое, не доведенное до конца. Ближе к практике:
|
|
|
inviZ |
7.6.2010, 16:59
Сообщение
#6
|
Студент Группа: Новичок Сообщений: 16 Регистрация: 5.6.2010 Пользователь №: 1781 Спасибо сказали: 4 раз(а) Репутация: 1 |
Цитата Ее сендер мне поможет только для запоминания указателя на вызванное меню. Это с чего вдруг? В слоте showContextMenu, который подсоединен к customContextMenuRequested, sender() вернет указатель на твой виджет, для которого вызвано контекстное меню. Ну и запоминаешь его где-нибудь... Например, так: act->setData(qVariantFromValue(sender())); |
|
|
Litkevich Yuriy |
7.6.2010, 17:20
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
inviZ, примерно тоже имел в виду и я, однако я забыл про существование QAction::setData
|
|
|
hkarel |
9.6.2010, 21:13
Сообщение
#8
|
Студент Группа: Участник Сообщений: 25 Регистрация: 25.5.2009 Пользователь №: 771 Спасибо сказали: 0 раз(а) Репутация: 0 |
Вот только руки "дошли" до задачи.
Цитата Ее сендер мне поможет только для запоминания указателя на вызванное меню. Это с чего вдруг? В слоте showContextMenu, который подсоединен к customContextMenuRequested, sender() вернет указатель на твой виджет ... Ну, в общем - да, согласен. act->setData(qVariantFromValue(sender())) - не подойдет, т.к. неразумно делать этот вызов для всех пунктов меню, вдобавок этот механизм используется для других нужд. В общем остановился на том, чтобы запоминать сендер как указатель на уровне формы. inviZ, Litkevich Yuriy - спасибо за консультацию. |
|
|
Текстовая версия | Сейчас: 28.12.2024, 18:26 |