0

QMenuBar に mouseMoveEvent を再実装して、フレームレス アプリケーションをクリック アンド ドラッグできるようにしています (基本的には、アプリの周りに独自のフレームを作成するだけです)。ただし、マウスがQMenuアイテムの上にあるときはいつでもこの動作を無効にしようとしています。これにより、奇妙な動作が発生します(メニューをクリックすると、ウィンドウがマウスに追従し始めます!)。

これは QMenuBar を呼び出すのと同じくらい簡単だと思いましたが、self.childrenRect().contains(event.pos())これは機能しません。私が言えることから、self.childrenRect()実際には QMenu 項目の rect は返されません。では、これを行う「正しい」方法は何ですか?

参考までに、サブクラス化された 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
4

1 に答える 1