python - Pyqt5 可拖动 QPushButton
问题描述
我有这个关于如何拖动和移动 QPushButton 的示例代码。该代码的唯一问题是,当您拖动按钮并释放它时,按钮状态保持为选中状态。
有人可以帮我更改代码,以便在拖动按钮并释放按钮状态后自动取消选中。所以,我不必单击它来取消选中它。
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtCore import Qt
class DragButton(QPushButton):
def mousePressEvent(self, event):
self.__mousePressPos = None
self.__mouseMovePos = None
if event.button() == Qt.LeftButton:
self.__mousePressPos = event.globalPos()
self.__mouseMovePos = event.globalPos()
super(DragButton, self).mousePressEvent(event)
def mouseMoveEvent(self, event):
if event.buttons() == 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 = QApplication([])
w = QWidget()
w.resize(800,600)
button = DragButton("Drag", w)
button.clicked.connect(clicked)
w.show()
app.exec_()
解决方案
您return
在 mouseReleaseEvent 中,这意味着您没有让按钮知道它实际上收到了鼠标释放,从而使状态保持为按下状态。
def mouseReleaseEvent(self, event):
if self.__mousePressPos is not None:
moved = event.globalPos() - self.__mousePressPos
if moved.manhattanLength() > 3:
event.ignore()
return # <-- the problem is here!
super(DragButton, self).mouseReleaseEvent(event)
如果您将鼠标移动几个像素(低于曼哈顿长度),您可以看到它的行为正确,因此您必须完全删除该if
块,或者self.setDown(False)
如果您想避免发送clicked
信号,则在返回之前调用。
推荐阅读
- c# - Xceed.Document.Load 在为页眉、页脚和页边距返回的结果中引发 ArgumentOutofBounds 异常
- linux - gpg 不要求在 bash 脚本中输入密码
- spring-boot - 每当我在标头中发送访问令牌时,Docker spring boot 返回 401
- powershell - 设置内容附加到其他文件
- plotly - 在 Axes 坐标之间添加标签
- python - 在 .xlsx 文件中创建新工作表
- spring - Kafka Stream:无法从 Kafka 持久 keyValue 状态存储中获取数据
- maven - Maven WebService 客户端依赖
- react-native - 用按钮反应本机打开抽屉
- json - 为什么我的 WordPress 域只能在没有 www 的情况下使用,而不能与 www 一起使用?