2011-04-25 54 views
1

所以我有一個無框QDialog,我希望能夠通過點擊和拖動來移動它。給定下面的代碼,拖動對話框始終將對話框的左上角(0,0)捕捉到鼠標。我該如何規避這個問題,或者說,數學可能會是什麼呢?用MouseMoveEvent移動一個無框QDialog

標準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 

回答

1

相反event.pos的(),嘗試調用event.globalPos()。從QMouseEvent參考中,「如果您因鼠標事件而移動小部件,請使用globalPos()返回的全局位置以避免發生抖動。」

+0

非常好!這工作,我已經更新了上面的代碼,以顯示我到目前爲止的位置。現在,我需要能夠在與對話框相關的位置抓住鼠標,因爲每當我左鍵單擊拖動對話框時,對話框的左上角就會捕捉到鼠標。 – Cryptite 2011-04-28 21:59:38

+0

你已經解決了這個問題嗎?我的鼠標對齊的對話框的左上角..我無法擺脫它 – apelliciari 2011-05-23 15:56:28

+0

不,我還沒有,我剛剛處理它現在堅持。希望有人能出面幫忙。 – Cryptite 2011-07-27 20:18:16

2

建議的解決方案移動窗口,但鼠標光標跳到窗口的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。經過很長時間我發現了一個重要的bug。如果您在任何按鈕上按下鼠標左鍵(剛剛啓動應用程序後),並將鼠標光標從該按鈕上拖離,則應用程序將崩潰,因爲我們引用不存在的變量LeftClick。這就是爲什麼在班級Main中我們需要創建LeftClick