Название: Q<control>View и key events Отправлено: SABROG от Июль 26, 2007, 16:49 Ситуация, как обычно, сложная. Т.к. интерфейс я рисую в дизайнере, то в моей программе нет ни одного унаследованного контрола, который бы я создавал ручками и лепил в нужное место на форму. С сигналами все более-менее понятно, а вот как обработать нажатие клавиш в QTreeView, скажем кнопку Del и удалить выбранный элемент ? Мышка это рулез форева, но иногда приходится обкликиваться, пока доберешься до нужного пункта меню... Неужели без InstallEvent фильтра не обойтись ?
Сейчас это реализовано так: Код:
Название: Re: Q<control>View и key events Отправлено: -=s0L=- от Июль 26, 2007, 18:15 Цитата: "SABROG" Ситуация, как обычно, сложная. Т.к. интерфейс я рисую в дизайнере, то в моей программе нет ни одного унаследованного контрола, который бы я создавал ручками и лепил в нужное место на форму. С сигналами все более-менее понятно, а вот как обработать нажатие клавиш в QTreeView, скажем кнопку Del и удалить выбранный элемент ? Мышка это рулез форева, но иногда приходится обкликиваться, пока доберешься до нужного пункта меню... Неужели без InstallEvent фильтра не обойтись ? Сейчас это реализовано так: Код:
врятли можно по другому, на сообщения клавиатуры qt генерирует события, а сигналы это уже выше уровнем, они для других целей. Название: Q<control>View и key events Отправлено: vaprele07 от Июль 27, 2007, 00:58 В дизайнере начиная с версии qt 4.3~ появилась фишка promote to, бросаешь на форму свой QTreeView, делаешь ему промоут от MyTreeView. Все просто и без заморочек.
и уже пользуешься сигналами а не слотами: Код:
Название: Q<control>View и key events Отправлено: Racheengel от Июль 27, 2007, 05:46 Ну во первых это не в 4.3 появилось, а раньше...
А во вторых, все равно придется наследоваться - делать класс MyTreeView. В третьих, а зачем тут emit? :roll: По моему надо что то типа QWidget::keyPressEvent(ke) вызвать в конце... Название: Q<control>View и key events Отправлено: vaprele07 от Июль 27, 2007, 07:53 Racheengel ну а что лучше использовать евэнт фильтр или готовый про виджет, промоут для того и был создан чтобы мы не парились с ручной подгонкой.
emit на случай если где-то у потомков забудется Q_OBJECT, компилятор игнорирует данную строку, она генерируется только при мок проходе. Код:
Название: Q<control>View и key events Отправлено: SABROG от Июль 27, 2007, 08:05 Спасиб, а можешь пояснить логику класса. Не могу вкурить для чего ignore, accepted и ручная отправка сигналов.
Название: Q<control>View и key events Отправлено: vaprele07 от Июль 27, 2007, 08:22 SABROG если тебе вдруг приспичить забанить логику обработки клавиши, допустим F2, ты в onKeyPressed делаешь event->accept();
Название: Q<control>View и key events Отправлено: bigirbis от Июль 27, 2007, 12:09 Я такую задачу с помощью QShortcut решал...
Название: Q<control>View и key events Отправлено: SABROG от Июль 27, 2007, 13:04 В принципе так работает, только есть проблема, шорткут, он и в африке шорткут, а значит работает независимо от фокуса окна, даже если я выбрал итем в другом QTreeView:
Код:
Название: Q<control>View и key events Отправлено: bigirbis от Июль 27, 2007, 13:55 Цитировать В принципе так работает, только есть проблема, шорткут, он и в африке шорткут, а значит работает независимо от фокуса окна, даже если я выбрал итем в другом QTreeView Попробуй так: Код: new QShortcut( Qt::Key_Insert, tvTemplate, SLOT( newTemplate() ), 0, Qt::WidgetShortcut ); Название: Q<control>View и key events Отправлено: SABROG от Июль 27, 2007, 18:48 Цитата: "bigirbis" Цитировать В принципе так работает, только есть проблема, шорткут, он и в африке шорткут, а значит работает независимо от фокуса окна, даже если я выбрал итем в другом QTreeView Попробуй так: Код: new QShortcut( Qt::Key_Insert, tvTemplate, SLOT( newTemplate() ), 0, Qt::WidgetShortcut ); Так не работает. А так работает: Код:
Вопрос про promote есть, там надо указывать header - .h файл, он должен сам создаваться или я его должен каким-то специальным образом оформить ? |