[QT4] Создание контекстного меню., Передача доп. аргументов в один из обработчиков. |
Здравствуйте, гость ( Вход | Регистрация )
[QT4] Создание контекстного меню., Передача доп. аргументов в один из обработчиков. |
fancer.lancer |
24.5.2010, 21:42
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 5 Регистрация: 23.3.2010 Пользователь №: 1555 Спасибо сказали: 0 раз(а) Репутация: 0 |
Здравствуйте форумчане, при написании Гуя на QT4 столкнулся с проблемой. Мне необходимо передать в обработчик одного из пункова контекстного меню координаты, которые соответствуют точке, откуда это меню было вызвано. Есть ли какой-либо метод (функция) или какой-либо способ сделать это без особенных извратов, таких как хранить где-нибудь коориднаты нажатия из QContextMenuEvent?
Просмотрел уже весь assistant, прочитал много примеров, но так ничего похожего не нашел. |
|
|
fancer.lancer |
25.5.2010, 7:31
Сообщение
#2
|
Новичок Группа: Новичок Сообщений: 5 Регистрация: 23.3.2010 Пользователь №: 1555 Спасибо сказали: 0 раз(а) Репутация: 0 |
Можно в обработчике (слоте) получить указатель на сендера, и если это QAction *, то из него получить указатель на QMenu, из которого вытянуть координаты нажатия, которые были переданы QMenu через функцию exec(). Это как вариант решения задачи.
Может у кого-нибудь есть другие соображения? |
|
|
Kagami |
25.5.2010, 7:41
Сообщение
#3
|
Старейший участник Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: 9 |
Можно просто посмотреть координаты мыши в обработчике (они будут глобальными) и привести их к нужному виджету (функции mapTo* и mapFrom*)
|
|
|
MoPDoBoPoT |
25.5.2010, 12:38
Сообщение
#4
|
Участник Группа: Участник Сообщений: 172 Регистрация: 7.5.2009 Из: Москва Пользователь №: 738 Спасибо сказали: 44 раз(а) Репутация: 9 |
Можно просто посмотреть координаты мыши в обработчике (они будут глобальными) Не получится, так как: Мне необходимо передать в обработчик одного из пункова контекстного меню координаты, которые соответствуют точке, откуда это меню было вызвано То есть, когда мы выбираем один из пунктов меню, мы уже двигаем мышь (если конечно навигация по меню не ограничена только стрелками ) Есть ли какой-либо метод (функция) или какой-либо способ сделать это без особенных извратов, таких как хранить где-нибудь коориднаты нажатия из QContextMenuEvent? Можно в обработчике (слоте) получить указатель на сендера, и если это QAction *, то из него получить указатель на QMenu, из которого вытянуть координаты нажатия, которые были переданы QMenu через функцию exec(). Да, это без особых извратов, а вот хранить точку вызова меню - изврат (без обид). Кстати, для этого метода есть еще нюанс. Реальная точка вызова контекстного меню не всегда равна его верхней точке (попробуй его вызвать, например, в правом нижнем углу экрана). То есть надо будет учитывать размер самого меню и расстояние от его левой верхней точки до правого и нижного краев экрана. Делай вывод, какой из методов менее извратный. |
|
|
fancer.lancer |
28.5.2010, 14:17
Сообщение
#5
|
Новичок Группа: Новичок Сообщений: 5 Регистрация: 23.3.2010 Пользователь №: 1555 Спасибо сказали: 0 раз(а) Репутация: 0 |
Извиняюсь за небольшую задержку)) Всем спасибо, за помощь))
Вообщем предложенный мной способ в итоге вообще не годиться((( если изначально QMenu был создан статически, то мы получаем указатель на нусуществующий элемент, если же динамически, то у меня почему-то опять же приложение падало при обращении к методам полученного указателя на QMenu, так и не выяснил почему((( Есть другой вариант: если мы выделили динамически память для объекта QMenu, то всегда можем узнать его координаты, если знаем указатель на этот объект. Тогда я решил просто создать дополнительное поле класса с этим QMenu. Теперь странность: при вызове контекстного меню мы получаем координаты относительно левого верхнего угла родительского виджета (то есть виджета, на котором это меню вызвано) как и нужно, а если пытаюсь посмотреть координаты самого меню, то они получаются относительно левого верхнего угла монитора. Вообщем остается одно - считать координаты вручную((((( |
|
|
MoPDoBoPoT |
28.5.2010, 16:47
Сообщение
#6
|
Участник Группа: Участник Сообщений: 172 Регистрация: 7.5.2009 Из: Москва Пользователь №: 738 Спасибо сказали: 44 раз(а) Репутация: 9 |
Ну раз ты все-таки захотел делать через пень-колоду...
Есть метод QPoint QWidget::mapFromGlobal ( const QPoint & pos ) const Также не забудь еще про один нюанс Реальная точка вызова контекстного меню не всегда равна его верхней левой точке (попробуй его вызвать, например, в правом нижнем углу экрана). То есть надо будет учитывать размер самого меню и расстояние от его левой верхней точки до правого и нижного краев экрана. |
|
|
fancer.lancer |
30.5.2010, 12:15
Сообщение
#7
|
Новичок Группа: Новичок Сообщений: 5 Регистрация: 23.3.2010 Пользователь №: 1555 Спасибо сказали: 0 раз(а) Репутация: 0 |
Цитата Ну раз ты все-таки захотел делать через пень-колоду... Есть метод QPoint QWidget::mapFromGlobal ( const QPoint & pos ) const Также не забудь еще про один нюанс если ты можешь предложить способ не через пень-колоду, то с радостью выслушаю. А вообще спасибо за подсказку с функцией: QPoint QWidget::mapFromGlobal ( const QPoint & pos ) const))) . PS А хранить в дополнительном поле класса кординаты вызова контекстного меню - это не через пень-колоду?))) или это трустайл? я, если честно, не считаю правильным переполнять класс предназначенный совершенно для других целей хранением каких-то координат, для этого есть соответсвующие объекты QMenu и его предки, из которых можно вытянуть нужную информацию... такое хранение портит наглядность структуры класса. Это лично мое мнение и с ним многие могут не согласиться))) |
|
|
MoPDoBoPoT |
30.5.2010, 16:13
Сообщение
#8
|
Участник Группа: Участник Сообщений: 172 Регистрация: 7.5.2009 Из: Москва Пользователь №: 738 Спасибо сказали: 44 раз(а) Репутация: 9 |
Как вариант, можно воспользоваться динамическими свойствами QObject'а:
В обработчике контестного меню перед вызовом QMenu::exec() для этого самого QAction установить в свойстве точку вызова меню myAction->setProperty("posOfContextMenuEvent", pos). А в обработчике данного экшена пользоваться значением, занесенным в данное свойство. Но это тоже криво. Для красивого решения здесь нужен опыт. |
|
|
fancer.lancer |
3.6.2010, 23:34
Сообщение
#9
|
Новичок Группа: Новичок Сообщений: 5 Регистрация: 23.3.2010 Пользователь №: 1555 Спасибо сказали: 0 раз(а) Репутация: 0 |
Спасибо, MoPDoBoPoT, за помощь и за интересные решения.
Да, ты прав, для это нужен опыт... |
|
|
Текстовая версия | Сейчас: 29.11.2024, 1:26 |