使用MouseMoveEvent移动无框架QDialog

时间:2011-04-25 16:24:05

标签: python pyqt mouseevent qdialog

所以我有一个无框架的QDialog,我希望能够通过单击并拖动它来移动。给定下面的代码,拖动对话框始终将对话框的左上角(0,0)捕捉到鼠标。我怎么能绕过这个,或者更确切地说,数学可能是什么呢?

标准QDialog,具有以下基本子类:

class Main(QtGui.QDialog):
    def __init__(self, args):
        QtGui.QDialog.__init__(self)

    def mouseMoveEvent(self, event):
        super(Main, self).mouseMoveEvent(event)
        if self.leftClick == True: self.moveWindow(event.globalPos())

    def mousePressEvent(self, event):
        super(Main, self).mousePressEvent(event)
        if event.button() == QtCore.Qt.LeftButton:
            self.leftClick = True

    def mouseReleaseEvent(self, event):
        super(Main, self).mouseReleaseEvent(event)
        self.leftClick = False

2 个答案:

答案 0 :(得分:2)

建议的解决方案移动Window,但鼠标光标跳转到Window的0,0。我希望鼠标光标始终保持在窗口的x,y上。

以下是[在QT5中]代码的升级版本:

X=0
X2=8  #!!!!
Y=0
Y2=30 #!!!!
class Main(QtWidgets.QMainWindow):
    leftClick = False #! IMPORTANT

    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

    def mouseMoveEvent(self, event):
        super(Main, self).mouseMoveEvent(event)
        if self.leftClick == True: 
            self.move(event.globalPos().x()-X-X2,event.globalPos().y()-Y-Y2)

    def mousePressEvent(self, event):
        super(Main, self).mousePressEvent(event)
        if event.button() == QtCore.Qt.LeftButton:
            self.leftClick = True
            global X,Y
            X=event.pos().x()
            Y=event.pos().y()

    def mouseReleaseEvent(self, event):
        super(Main, self).mouseReleaseEvent(event)
        self.leftClick = False

对于无框窗口(用window.setMask()制作)我需要一些常量,如X2和Y2,因为"掩盖"无框窗口比实际框架窗口小一点。不知道如何计算这种差异。

UP。很长一段时间后,我发现了一个严重错误。如果您在任何按钮上按下鼠标左键(在应用程序启动后)并将鼠标光标拖离该按钮,您的应用程序将崩溃,因为我们引用了不存在的变量 LeftClick 。这就是为什么在Main类我们需要创建 LeftClick

答案 1 :(得分:1)

而不是event.pos(),尝试调用event.globalPos()。从QMouseEvent引用,“如果您因鼠标事件而移动窗口小部件,请使用globalPos()返回的全局位置以避免抖动。”