所以我有一个无框架的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
答案 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()返回的全局位置以避免抖动。”