[英]Pyqt5 draggable 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_()
您在 mouseReleaseEvent 中return
,這意味着您不會讓按鈕知道它實際上收到了鼠標釋放,從而使狀態保持為按下狀態。
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
信號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.