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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeView QAction контекстное меню для разных типов веток  (Прочитано 6462 раз)
SABROG
Гость
« : Апрель 12, 2007, 22:03 »

Появилась такая необходимость, хочу сделать для каждой ветки в QTreeView свое контекстное меню. Например как сделано в QDevelop.
Его исходники я поковырял и обнаружил, что ларчик открывается через наследование QTreeView. Слазил я и в Assistant и тоже увидел, что там это реализуется через наследование, только наследуется уже другой метод.

Но вот, хоть убейте, не хочу я наследовать визуальные компоненты, главное окошко приложения рисуется в дизайнере и я не хочу потом, во время исполнения, "подрисовывать" свой TreeView на нужном месте. Как-то это не правильно, мне кажется, особенно, если я еще не определился с окончательным интерфейсом и имена виджетов и их количество могут меняться, а мне после таких изменений еще и в исходники лезть придется, чтобы их править, нет уж увольте.

Есть сигнал clicked, я бы рад его обрабатывать, вот только не знаю, как определить какая клавиша была нажата, мне нужна правая. А также я не знаю вызовется ли слот перед контекстным меню или после, а это важно, т.к. я хочу менять список QAction'ов на лету перед всплытием контекстного меню, ну а выцепить итем на котором был клик думаю не составит труда... надеюсь.

добавлено спустя 16 минут:

 Кажись я все-таки нашел для себя золотую середину.
Обрабатываем clicked(), и на каждый клик определяем через currentIndex() итем, пересоздаем контекстное меню. Недостаток - меню будет пересоздаваться два раза: при выборе итема, при нажатии правой кнопкой мышки для вызова меню. Будем думать, может быть я и смогу пережить такой "хак"

добавлено спустя 31 минуту:

 Так, вроде начинаю въезжать. Думается мне, что вместо contextMenuPolicy = Qt::ActionsContextMenu надо поставить Qt::CustomContextMenu, а потом ловить сигнал customContextMenuRequested  и обрабатывать его в: on_myTreeView_customContextMenuRequested( const QPoint & pos )

Соответственно беру итем по currentIndex() и в зависимости от типа рисую по координатам из QPoint свою менюшку. Осталось это реализовать...
Записан
alexis
Гость
« Ответ #1 : Апрель 13, 2007, 08:49 »

клево ты сам с собой пообщался Улыбающийся
CustomContextMenu - самое "оно", если не хочешь наследоваться.
Записан
WW
Гость
« Ответ #2 : Апрель 13, 2007, 10:42 »

Насчет дизайнера и наследования QTreeView. В примерах используют некий хак: рисуют форму, стандартное тривью, все как тебе нужно. Потом вручную в ui файле заменяют QTreeView на свой класс. форма также потом может открывается в дизайнере, допиливаться и т.д. Компилиться как обычно uic'ом.
Записан
SABROG
Гость
« Ответ #3 : Апрель 13, 2007, 21:10 »

Спасибо за совет. Я сделал через CustomContextMenu, вроде все работает.

добавлено спустя 8 часов 34 минуты:

 Вот еще себе задачку нашел. Хочу сделать поддержку перетаскивания итемов в QTreeView, но так, чтобы итемы одного типа могли перетаскиваться только в пределах своего родителя и только на итемы своего типа. Как сделать такую проверку я знаю. Я пока себе смутно представляю как перехватить событие, чтобы вернуть нечто такое, чтобы позволило изменить курсор на зачеркнутый красный кружечек и запретить перетаскивание. Пока копаю в сторону dragEnterEvent и installEventFilter
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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