получить QRect меню в QMenuBar - PullRequest
       27

получить QRect меню в QMenuBar

0 голосов
/ 26 апреля 2018

Я заново реализую mouseMoveEvent в QMenuBar, чтобы позволить мне перетаскивать безрамочное приложение вокруг себя (в основном, просто создавая свой собственный кадр вокруг моего приложения).Однако я пытаюсь отключить это поведение, когда мышь находится над элементом QMenu, что вызывает странное поведение (окна начинают следовать за вашей мышью, когда вы нажимаете на меню!).

Я думал, что это будет так же простокак вызов QMenuBar's self.childrenRect().contains(event.pos()), однако это не работает.Из того, что я могу сказать, self.childrenRect() на самом деле не возвращает прямоугольник элементов QMenu.Так какой же «правильный» способ сделать это?

Вот мой подкласс QMenuBar для справки:

class MoveMenu(QtGui.QMenuBar):
    def __init__(self):
        super(MoveMenu, self).__init__()
        self.mouseStartLoc = QtCore.QPoint(0,0)
        self.set_move = False

    def mousePressEvent(self, event):
        super(MoveMenu, self).mousePressEvent(event)
        self.mouseStartLoc = event.pos()

        # this is always testing False
        if not self.childrenRect().contains(event.pos()):
            self.set_move = True

    def mouseMoveEvent(self, event):
        super(MoveMenu, self).mouseMoveEvent(event)
        if self.set_move:
            globalPos = event.globalPos()
            self.parent().move(globalPos - self.mouseStartLoc)

    def mouseReleaseEvent(self, event):
        super(MoveMenu, self).mouseReleaseEvent(event)
        self.set_move = False

1 Ответ

0 голосов
/ 26 апреля 2018

С помощью eyllanesc вот рабочий код.self.childrenRect () не работает (ошибка?), но циклическое переключение дочерних элементов выполняется вручную.

class MoveMenu(QtGui.QMenuBar):
    def __init__(self):
        super(MoveMenu, self).__init__()
        self.mouseStartLoc = QtCore.QPoint(0,0)
        self.set_move = False

    def mousePressEvent(self, event):
        super(MoveMenu, self).mousePressEvent(event)
        self.mouseStartLoc = event.pos()

        if not any(child.rect().contains(event.pos()) for child in self.children():
            self.set_move = True

    def mouseMoveEvent(self, event):
        super(MoveMenu, self).mouseMoveEvent(event)
        if self.set_move:
            globalPos = event.globalPos()
            self.parent().move(globalPos - self.mouseStartLoc)

    def mouseReleaseEvent(self, event):
        super(MoveMenu, self).mouseReleaseEvent(event)
        self.set_move = False
...