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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] отправить перехваченное событие родителю  (Прочитано 13472 раз)
Akon
Гость
« Ответ #15 : Декабрь 23, 2014, 01:30 »

Ну а в чем разница между первым даблкликом (когда ничего не происходит) и последующими (когда все ОК)?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #16 : Декабрь 23, 2014, 01:31 »

если б я знал Улыбающийся

даблклики вне лейбла срабатывают сразу.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
DenKor29
Гость
« Ответ #17 : Декабрь 23, 2014, 09:23 »

P.s переопределите mousePressEvent для QLabel в крайнем случае
смысл? фильтр событий же и так висит и все ловит. проблема именно в отправке события (точнее его обработке листвью).
[/quote]

например в mousePressEvent  не обрабатываете сигнал двойного нажатия мыши и игнорируете данное событие.
Как я понимаю это событие будет послано дальше автоматом QListView (если оно находится за объектом QLabel).
Никаких фильтров при этом использовать не нужно будет.

У Вас слишком сложная логика обработки событий используется ....
Записан
Akon
Гость
« Ответ #18 : Декабрь 23, 2014, 12:28 »

А если попробовать табом перейти на ячейку (чтобы последняя получила фокус) и даблкликнуть?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #19 : Декабрь 23, 2014, 16:15 »

например в mousePressEvent  не обрабатываете сигнал двойного нажатия мыши и игнорируете данное событие.
Как я понимаю это событие будет послано дальше автоматом QListView (если оно находится за объектом QLabel).
Никаких фильтров при этом использовать не нужно будет.

У Вас слишком сложная логика обработки событий используется ....
и чем это отличается от того, что я проигнорирую или приму событие в фильтре? как уже писал выше, это не помогает.

с удовольствием выслушаю логику попроще. есть листвью с моделью:
- каждый айтем содержит текст, который должен выделяться мышкой
- использую делегат т.к. надо еще и другие вещи отрисовывать в айтеме
- есть обработчик даблклика листвью
- даблклик не должен выделять отдельные слова в тексте, а должен срабатывать обработчик из предыдущего пункта
А если попробовать табом перейти на ячейку (чтобы последняя получила фокус) и даблкликнуть?
жал таб произвольное количество раз и даблкликал — не помогает.

могу написать тестовый проект если кто-то поковыряться хочет.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Декабрь 23, 2014, 16:31 »

могу написать тестовый проект если кто-то поковыряться хочет.
Давайте попробуем (ничего не обещаю но разобраться попытаюсь)
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #21 : Декабрь 23, 2014, 17:27 »

проект в аттаче. в Qt 4 беда аналогичная.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Декабрь 23, 2014, 20:13 »

"Так и должно быть" - хотя от этого не легче  Улыбающийся Испущенное Вами в фильтре событие обрабатывается здесь
Код
C++ (Qt)
void QAbstractItemView::mouseDoubleClickEvent(QMouseEvent *event)
{
   Q_D(QAbstractItemView);
 
   QModelIndex index = indexAt(event->pos());
   if (!index.isValid()
       || !d->isIndexEnabled(index)
       || (d->pressedIndex != index)) {
       QMouseEvent me(QEvent::MouseButtonPress,
                      event->localPos(), event->windowPos(), event->screenPos(),
                      event->button(), event->buttons(), event->modifiers());
       mousePressEvent(&me);
       return;
   }
   // signal handlers may change the model
   QPersistentModelIndex persistent = index;
   emit doubleClicked(persistent);
...
 
То есть если даблкликнутая ячейка неактивна, то она активируется - но до emit doubleClicked(persistent) дело не доходит. Только если она уже активна - тогда да.

Может лучше перекрыть mouseDoubleClickEvent - не обдумывал, просто первое что приходит в голову
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #23 : Декабрь 23, 2014, 20:25 »

пробовал перед sendEvent делать setCurrentIndex() — почему-то не помогало...
Может лучше перекрыть mouseDoubleClickEvent - не обдумывал, просто первое что приходит в голову
получилось только так, но это ж ничем не отличается от эмита прямо в фильтре Улыбающийся
Код
C++ (Qt)
   void mouseDoubleClickEvent(QMouseEvent *e)
   {
       emit doubleClicked(indexAt(e->pos()));
   }
 
   bool eventFilter(QObject *o, QEvent *e)
   {
       if (o->inherits("QLabel") && e->type() == QEvent::MouseButtonDblClick)
       {
           auto me = static_cast<QMouseEvent *>(e);
           if (me->button() == Qt::LeftButton)
           {
               e->ignore();
               return true;
           }
       }
       return QListView::eventFilter(o, e);
   }
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Декабрь 24, 2014, 08:45 »

получилось только так, но это ж ничем не отличается от эмита прямо в фильтре Улыбающийся
Первым dbl событие получает QLabel. Если ничего не делать, то событие будет обработано и другие его не получат. Это не устраивает, значит решение навесить фильтр правильное. Остается только где эмиттить - да, разницы тоже не вижу, хотя путь события разный.

Итого: все норм, какого-то лучшего пути не видно (неоткуда взяться)
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #25 : Декабрь 24, 2014, 13:56 »

например, в Cocoa Touch (думаю и в Cocoa тоже) есть возможность переопределить метод hitTest:withEvent: у виджета (UIView), и таким образом контролировать доставку событий. если из метода вернуть false, то событие просто отправится в супервью (parent widget). в Qt ничего подобного нету? или e->ignore() это и делает, но почему-то не отрабатывает как хотелось бы?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Декабрь 24, 2014, 14:39 »

.. или e->ignore() это и делает, но почему-то не отрабатывает как хотелось бы?
Делает и отрабатывает. "Позиционное" событие от мыши сначала подается видимому виджету под мышей.  Если он его "сожрет" - на этом все и кончается. Если нет, то его паренту и.т.д. вверх пока кто-то его не примет (accepted). Когда проигнорирвали в фильтре - дело доходит до QAbstractItemView::mouseDoubleClickEvent, просто он не всегда испускает нужный сигнал
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #27 : Декабрь 24, 2014, 14:59 »

понял, спасибо
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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