4

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

2 回答 2

2

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

于 2011-04-28T19:41:10.353 回答
2

建议的解决方案移动 Window,但鼠标光标跳到 Window 的 0,0。我希望鼠标光标一直停留在窗口的 x,y 上。

这是代码的升级版本 [in 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,因为“蒙版”无框窗口比真正的有框窗口小一点。还不知道如何计算这个差异。

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

于 2015-12-08T12:01:36.240 回答