Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: SABROG от Апрель 12, 2007, 22:03



Название: 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