i
istiksi7 мая 2017 г. 7:41

Не приходят mousePressEvent от дочерних item'ов а

PyQT5 QT5 QGraphicsItem

На QGraphicsScene размещен переопределенный QGraphicsRectItem, в который добавлены с помощью addItem несколько дочерних QGraphicsRectItem. Фильтр событий для child'ов включен (setFiltersChildEvents(True)). По идее, любой клик на child, должен вызывать mousePressEvent у родительского QGraphicsRectItem, но это не работает. Клики на родителе работают. В документации внятного примера не нашел, только про игнорирование hoverEvent'ов от child. Что я делаю не так?

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

5
Evgenii Legotckoi
  • 7 мая 2017 г. 8:54

Код смотреть нужно, что именно там напереопределяли. Метод mousePressEvent переопределяли? Если да, то по-хорошему нужно вызывать метод базового класса mousePressEvent, чтобы дальше по стеку событий прокинуть событие в родительские объекты.

    i
    • 7 мая 2017 г. 9:14

    Метод mousePressEvent переопределил только для отладочной информации, super вызываю. Если выкинуть все лишнее, не относящееся к вопросу, то примерно так:

    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from PyQt5.QtGui import QPen, QBrush
    from PyQt5.QtCore import Qt, QRectF, QSizeF, QPointF
    from PyQt5.QtWidgets import (QGraphicsScene, QGraphicsView,
        QGraphicsTextItem, QGraphicsItem, QGraphicsRectItem, QGraphicsLineItem, QGraphicsLineItem)
    
    
    class LPScene(QGraphicsScene):
        def __init__(self):
            super(LPScene, self).__init__()
            self.setSceneRect(0, 0, 600, 600)
            self.setPalette()
    
        def setPalette(self):
            self.a = LogicBlock(0,0,100,150)
            self.a.setPos(100, 100)
            self.addItem(self.a)
    
    class LogicBlock(QGraphicsRectItem):
        def __init__(self, x,y,w,h):
            super(LogicBlock, self).__init__(x, y, w, h)
            self.setFiltersChildEvents(True)
            self.setFlags(QGraphicsItem.ItemIsMovable )
            new_child = QGraphicsRectItem(-20, 50, 20, 10, self)
    
        def boundingRect(self):
            extra = 2 / 2.0
            return QRectF(QPointF(0, 0), QSizeF(100, 150)).normalized().adjusted(-extra, -extra, extra, extra)
    
        def paint(self, QPainter, QStyleOptionGraphicsItem, QWidget_widget=None):
            QPainter.drawRoundedRect(0, 0, 100, 150, 5, 5)
    
        def mousePressEvent(self, ItemEvent):
            print "ItemEvent.pos()"
            print ItemEvent.pos()
            super(LogicBlock, self).mousePressEvent(ItemEvent)
           
    
      i
      • 7 мая 2017 г. 9:16

      Редактировать оказывается свой ответ нельзя... В общем, меня интересует, как мне получить event нажатия на new_child. Отрисовывается он нормально, перетаскивается вместе с родителем, но вот события не шлет

        Evgenii Legotckoi
        • 7 мая 2017 г. 11:27
        • Ответ был помечен как решение.

        В общем события сыпятся в другой обработчик. В один общий обработчик для всех событий.

        class LogicBlock(QGraphicsRectItem):
            def __init__(self, x,y,w,h):
                super(LogicBlock, self).__init__(x, y, w, h)
                self.setFiltersChildEvents(True)
                self.setFlags(QGraphicsItem.ItemIsMovable)
                new_child = QGraphicsRectItem(-50, 50, 20, 10, self)
        
            # В данный обработчик сыпятся все события, потомков,
            # если был применен метод setFiltersChildEvents(True)
            def sceneEventFilter(self, watched, event):
                print('CHECK EVENT')
                print(watched)
                print(event)
                return super(LogicBlock, self).sceneEventFilter(watched, event)

        До редактирования комментариев на сайте пока руки не доходят, чтобы написать. Так что пока без редактирования.

          i
          • 7 мая 2017 г. 13:38

          Понятно, спасибо

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь
            d
            • dsfs
            • 26 апреля 2024 г. 14:56

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:80баллов,
            • Очки рейтинга4
            d
            • dsfs
            • 26 апреля 2024 г. 14:45

            C++ - Тест 002. Константы

            • Результат:50баллов,
            • Очки рейтинга-4
            d
            • dsfs
            • 26 апреля 2024 г. 14:35

            C++ - Тест 001. Первая программа и типы данных

            • Результат:73баллов,
            • Очки рейтинга1
            Последние комментарии
            k
            kmssr9 февраля 2024 г. 5:43
            Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
            АК
            Анатолий Кононенко5 февраля 2024 г. 12:50
            Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
            EVA
            EVA25 декабря 2023 г. 21:30
            Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
            J
            JonnyJo25 декабря 2023 г. 19:38
            Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
            G
            Gvozdik19 декабря 2023 г. 8:01
            Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
            Сейчас обсуждают на форуме
            BlinCT
            BlinCT5 мая 2024 г. 15:46
            Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
            BlinCT
            BlinCT5 мая 2024 г. 15:44
            добавить qlineseries в функции Давно я не работал с виджетами и с формами, на мой взгляд уже пережитов, и в управлении не очень удобное это все. Н оя у вас не увидел в коде где вы QCharts растягиваете на область парента.…
            PS
            Peter Son4 мая 2024 г. 3:57
            Best Indian Food Restaurant In Cincinnati OH Ready to embark on a gastronomic journey like no other? Join us at App india restaurant and discover why we're renowned as the Best Indian Food Restaurant In Cincinnati OH . Whether y…
            Evgenii Legotckoi
            Evgenii Legotckoi3 мая 2024 г. 0:07
            Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
            IscanderChe
            IscanderChe30 апреля 2024 г. 14:22
            Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

            Следите за нами в социальных сетях