python qt 按钮实现拖放_python – 在PyQt中拖动/移动QPushButton

下面是一个可移动按钮的示例,它仍然可以正常支持正常的点击信号:

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中,我检查整体移动是否大于至少一小部分.如果是,那就是拖累,我们忽略了正常事件,不产生“点击”信号.否则,我们允许普通事件处理程序生成单击.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值