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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: наследоваие событий потомками  (Прочитано 3092 раз)
vux
Гость
« : Ноябрь 10, 2011, 23:29 »

у меня есть виджет внутри которого находяться другие виджеты.
Этому (главному) я назначаю eventFilter. Но мне хочеться чтобы внутренние тоже реагировали на этот фильтр - не хочеться назначать его на приложение цэликом в цэлях экономии ресурсов. Еще нюанс в том что виджэты(потомки) будут постоянно появляться в главном виджэте. Есть ли способ решить мою задачу?
« Последнее редактирование: Ноябрь 10, 2011, 23:30 от vux » Записан
andrew.k
Гость
« Ответ #1 : Ноябрь 10, 2011, 23:36 »

Код
C++ (Qt)
bool KeyPressEater::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::KeyPress) {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
        qDebug("Ate key press %d", keyEvent->key());
        return true;
    } else {
        // standard event processing
        return QObject::eventFilter(obj, event);
    }
}
Тебя интересует else. В этом случае события должны доходить до потомков.
А ты видимо всегда возвращаешь true.
Если я вообще правильно понял, что тебе требуется.

Кстати, сколько ресурсов удалось сэкономить в твоем подходе?  Подмигивающий
« Последнее редактирование: Ноябрь 10, 2011, 23:38 от andrew.k » Записан
vux
Гость
« Ответ #2 : Ноябрь 11, 2011, 00:00 »

я пишу на питоне

Код
Python
class Filter( qtc.QObject ):
def eventFilter(self, obj, event):
if event.type() == 2: # MouseЗкуыыEvent
print 'mouse press'
return True
else:
return qtc.QObject.eventFilter( self, obj, event )

если делать так, как вы советуете то событие не доходит до потомка/



В моем случае экономить нада так как в програме присутствует openGL виджет. Мне нада навесить много разных событий на мышу. Если я назначу фильтр всему приложению - то события будут отслеживаться в openGl-зоне где будет вестись интенсивная работа той жэ мышой
Записан
andrew.k
Гость
« Ответ #3 : Ноябрь 11, 2011, 00:27 »

Код
Python
class Filter( qtc.QObject ):
def eventFilter(self, obj, event):
if event.type() == 2: # MouseЗкуыыEvent
print 'mouse press'
 
           return qtc.QObject.eventFilter( self, obj, event )
 

А вот так?

ПС. Что за странная манера писать на форуме "вы"?  Смеющийся
Записан
vux
Гость
« Ответ #4 : Ноябрь 11, 2011, 00:32 »


А вот так?

не реагирует потомок на нажатие мыши
Записан
andrew.k
Гость
« Ответ #5 : Ноябрь 11, 2011, 01:26 »

а без фильтра реагирует? Такого же не может быть.
Записан
andrew.k
Гость
« Ответ #6 : Ноябрь 11, 2011, 02:03 »

Я понял.
Приведенный мной код тебе не поможет, похоже
Событие попадает сначала в потомок и если там оно не обработалось (return false), потому что обработчика нет и оно идет выше, к родителю.
Ты перехватываешь его в родителе, когда уже поздновато.
Записан
vux
Гость
« Ответ #7 : Ноябрь 11, 2011, 11:00 »

Я понял.
Приведенный мной код тебе не поможет, похоже
Событие попадает сначала в потомок и если там оно не обработалось (return false), потому что обработчика нет и оно идет выше, к родителю.
Ты перехватываешь его в родителе, когда уже поздновато.

Я это тоже понимаю. Внутреннему виджету фильтр не назначен, вот он и молчит - он жэ всетаки под мышой в этот момент.
Нада чтобы внутренние виджэты были образно говоря прозрачными - и первыми должны отлавливаться события нижнего главного виджэта.
Типа чтоб потомки сначала обрабатывали свои события, а потом вызывали события главного виджэта или наоборот.
Это можно сделать назначением фильтра всем внутренним контролам. Но я не могу этого сделать - внутренность главного виджэта постоянно меняэться - одни контролы удаляються - другие появляються. Как быть я пока не знаю  Грустный
Записан
SASA
Гость
« Ответ #8 : Ноябрь 14, 2011, 17:39 »

Код для "прозрачности" класса виджетов CMyWidget для евента MouseMove.

Код:
bool CMyApp::notify ( QObject * receiver, QEvent * event ) 
{
if (event->type() == QEvent::MouseMove && receiver->inherits("CMyWidget"))
{
QPoint p = ((QMouseEvent*)event)->globalPos();
QWidget* newReceiver = widgetAt(p); // найдём того, кто лежит под виджетом
if (newReceiver) // а таки лежит
{
receiver = newReceiver; // переправим событие нижележащему
}
}
return QApplication::notify(receiver,event);
}
Может поможет. 
З.Ы. Если Вы собираетесь пользоваться этим кодом, то делаете это на свой страх и риск. За возможные часы проведенные в дебагере автор ответственности не несет. Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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