Название: QTreeView QAction контекстное меню для разных типов веток Отправлено: 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 свою менюшку. Осталось это реализовать... Название: QTreeView QAction контекстное меню для разных типов веток Отправлено: alexis от Апрель 13, 2007, 08:49 клево ты сам с собой пообщался :)
CustomContextMenu - самое "оно", если не хочешь наследоваться. Название: QTreeView QAction контекстное меню для разных типов веток Отправлено: WW от Апрель 13, 2007, 10:42 Насчет дизайнера и наследования QTreeView. В примерах используют некий хак: рисуют форму, стандартное тривью, все как тебе нужно. Потом вручную в ui файле заменяют QTreeView на свой класс. форма также потом может открывается в дизайнере, допиливаться и т.д. Компилиться как обычно uic'ом.
Название: QTreeView QAction контекстное меню для разных типов веток Отправлено: SABROG от Апрель 13, 2007, 21:10 Спасибо за совет. Я сделал через CustomContextMenu, вроде все работает.
добавлено спустя 8 часов 34 минуты: Вот еще себе задачку нашел. Хочу сделать поддержку перетаскивания итемов в QTreeView, но так, чтобы итемы одного типа могли перетаскиваться только в пределах своего родителя и только на итемы своего типа. Как сделать такую проверку я знаю. Я пока себе смутно представляю как перехватить событие, чтобы вернуть нечто такое, чтобы позволило изменить курсор на зачеркнутый красный кружечек и запретить перетаскивание. Пока копаю в сторону dragEnterEvent и installEventFilter |