Как правильно установить eventFilters на QGraphicsItemGroup - PullRequest
0 голосов
/ 09 мая 2019

У меня есть набор кнопок QSvgGraphicsItem, которые я хотел бы сгруппировать как часть единого пользовательского интерфейса, чтобы сделать их подвижными в QGraphicsScene.Когда я группирую их, они больше не отвечают на mousePressEvents.

Я пытался поместить eventFilters в QGraphicsItemGroup, на каждый отдельный QSvgGraphicsItem.Я искал бесконечные примеры того, как они настроены для отдельных элементов, но я не могу найти примеров того, как установить их на группу элементов.В следующем коде показано, как мне удалось передать события каждой кнопке, переопределив mousePressEvent, но когда я пытаюсь сгруппировать весь интерфейс вместе с CreateGraphicsItemGroup, чтобы он перемещался как единое целое, кнопки теряют возможность получить mousePressEvents.и тогда я не могу переключиться на другое меню.Я нашел обходной путь, но помещать каждое событие мыши для всей моей программы в основное mousePressEvent и проверять, в каком ограничивающем окне находится мышь, не кажется самым элегантным способом выполнения действий ...

class User(QGraphicsWidget):
    def __init__(self, parent=None):
        super(User, self).__init__(parent)

        self.Ptolemy = parent
        print("USER PARENT: ", self.Ptolemy)


        self.styles = self.Ptolemy.stylesheet

        self.x = self.Ptolemy.scene.width() / 2 - 76
        self.y = self.Ptolemy.scene.height() / 2 - 175
        self.w = 225
        self.h = 350
        self.centerx = self.x + self.w / 2
        self.centery = self.y + self.h / 2

        self.setGeometry(self.x, self.y, self.w, self.h)

        self.setStyleSheet(self.styles)
        self.setStyleSheet("QWidget { background-color: transparent; } ")

        self.output = self.Ptolemy.Philadelphos.setOutput
        self.interfaceImg = self.Ptolemy.pharosImg
        print("PATH:", self.interfaceImg)
        self.mediaDir = self.Ptolemy.mediaDir
        self.scene = self.Ptolemy.scene

        self.MONITOR = False

        # self.procTimer = QTimer()
        # self.procTimer.timeout.connect(self.switchMonitor)
        # self.procTimer.setSingleShot(True)

        self.identity = "Pharos"
        self.cwd = "*".join(self.Ptolemy.cwd()[1:].split("/")[-3:])

        self.setToolTip(self.identity + " Interface")
        images = os.listdir(self.interfaceImg)
        rand = randrange(len(images))
        self.bgImage = "nav_seal_200.png"

        self.initUi()

    def __del__(self):

        pass

    def initUi(self):

        self.btnSize = 23

        self.buildButtons()

        self.layout = QGridLayout(self)

        self.originalLayout()

        self.setLayout(self.layout)


    def mouseMoveEvent(self, event):
        print("Mouse Move Event")

        pass

    def buildButtons(self):

        self.blankBtn = QSvgWidget(self.interfaceImg + 'blank.svg')
        self.blankBtn.setFixedSize(self.btnSize, self.btnSize)

        self.powerBtn = QSvgWidget(self.interfaceImg + "power.svg")
        self.powerBtn.setFixedSize(self.btnSize, self.btnSize)
        self.powerBtn.setToolTip("Exit Program")
        self.powerBtn.mousePressEvent = self.power

        self.archimedesBtn = QSvgWidget(self.interfaceImg + 'archimedessymbol.svg')
        self.archimedesBtn.setFixedSize(self.btnSize, self.btnSize)
        self.archimedesBtn.setToolTip("Archimedes Menu")
        self.archimedesBtn.mousePressEvent = self.archimedesMenu

        self.alexandriaBtn = QSvgWidget(self.interfaceImg + 'alexandriasymbol.svg')
        self.alexandriaBtn.setFixedSize(self.btnSize, self.btnSize)
        self.alexandriaBtn.setToolTip('Alexandria Symbol')
        self.alexandriaBtn.mousePressEvent = self.alexandriaMenu


    def clearLayout(self):
        print("Clear Layout")

        for i in self.sysTrayList[2:-1]:
            code = 'self.{0}Btn.deleteLater()'.format(i)
            # print(code)
            exec(code)

        self.buildButtons()

        self.layout.addWidget(self.pharosBtn, 11, 1, 1, 1)

    def originalLayout(self):

        self.displayItem = self.layout.addWidget(self.display, 0, 0, 10, 10)
        self.powerItem = self.layout.addWidget(self.powerBtn, 11, 0, 1, 1)
        self.alexandriaItem = self.layout.addWidget(self.alexandriaBtn, 11, 1, 1, 1)
        self.archimedesItem = self.layout.addWidget(self.archimedesBtn, 11, 2, 1, 1)

    def power(self, event):
        exit()

        pass

    def archimedesMenu(self, event):
        print('Archimedes')
        self.UserDisplay.changeIdentity('Archimedes')
        self.clearLayout()
        self.layout.addWidget(self.graphBtn, 11, 2, 1, 1)

        pass

    def alexandriaMenu(self, event):
        print('Alexandria')
        self.UserDisplay.changeIdentity('Alexandria')
        self.clearLayout()
        self.layout.addWidget(self.coreBtn, 11, 2, 1, 1)
        self.layout.addWidget(self.earthBtn, 11, 3, 1, 1)

        pass
...