【问题标题】:Moving a frameless QDialog with a MouseMoveEvent使用 MouseMoveEvent 移动无框 QDialog
【发布时间】:2011-08-12 10:25:33
【问题描述】:

所以我有一个无框 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

【问题讨论】:

    标签: python pyqt mouseevent qdialog


    【解决方案1】:

    建议的解决方案移动 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

    【讨论】:

      【解决方案2】:

      尝试调用 event.globalPos(),而不是 event.pos()。来自QMouseEvent 参考,“如果您因鼠标事件而移动小部件,请使用 globalPos() 返回的全局位置来避免晃动。”

      【讨论】:

      • 太棒了!那行得通,我已经更新了上面的代码以显示我到目前为止的位置。现在我需要能够抓住鼠标相对于对话框的位置,因为每当我左键单击以拖动对话框时,对话框的左上角都会捕捉到鼠标。
      • 你解决了这个问题吗?我的鼠标也卡在对话框的左上角......我无法摆脱它
      • 不,我还没有,我只是暂时处理它。希望有人能过来帮忙。
      • 嘿,我遇到了同样的问题并解决了。将第一次点击的坐标存储在 mousePressEvent 中:self.clickX = event.x() self.clickY = event.y() 然后,移动窗口并修正初始点击位置:self.move(event.globalPos(event.globalX-self.clickX, event.globalY-self.clickY)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      相关资源
      最近更新 更多