這裏是還支持正常的點擊信號對可移動按鈕的例子:
from PyQt4 import QtCore, QtGui
class DragButton(QtGui.QPushButton):
def mousePressEvent(self, event):
self.__mousePressPos = None
self.__mouseMovePos = None
if event.button() == QtCore.Qt.LeftButton:
self.__mousePressPos = event.globalPos()
self.__mouseMovePos = event.globalPos()
super(DragButton, self).mousePressEvent(event)
def mouseMoveEvent(self, event):
if event.buttons() == QtCore.Qt.LeftButton:
# adjust offset from clicked point to origin of widget
currPos = self.mapToGlobal(self.pos())
globalPos = event.globalPos()
diff = globalPos - self.__mouseMovePos
newPos = self.mapFromGlobal(currPos + diff)
self.move(newPos)
self.__mouseMovePos = globalPos
super(DragButton, self).mouseMoveEvent(event)
def mouseReleaseEvent(self, event):
if self.__mousePressPos is not None:
moved = event.globalPos() - self.__mousePressPos
if moved.manhattanLength() > 3:
event.ignore()
return
super(DragButton, self).mouseReleaseEvent(event)
def clicked():
print "click as normal!"
if __name__ == "__main__":
app = QtGui.QApplication([])
w = QtGui.QWidget()
w.resize(800,600)
button = DragButton("Drag", w)
button.clicked.connect(clicked)
w.show()
app.exec_()
在mousePressEvent
我記錄了初始起始位置,這將能在整個拖動更新的位置。
在mouseMoveEvent
中,我得到了控件從被點擊的位置到實際原點位置的正確偏移量,以便移動是準確的。
在mouseReleaseEvent
,我檢查整體移動是否大於至少一個微小的數額。如果是,那麼這是一個阻力,我們忽略了正常事件不會產生「點擊」信號。否則,我們允許普通事件處理程序產生點擊。
來源
2012-08-31 19:19:18
jdi
@Eric在他的回答中提出了一個非常好的觀點。您能否澄清這個問題,您是否想要真正的拖放事件......或者只是簡單地用鼠標移動按鈕 – jdi
根據您打算做的事情 - 我會查看QGraphicsView框架。你正在嘗試做什麼(虛擬磁鐵板)將很容易完成。 –