【问题标题】:Pyqt5 draggable QPushButtonPyqt5 可拖动 QPushButton
【发布时间】:2020-03-25 18:15:44
【问题描述】:

我有这个关于如何拖动和移动 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_() 

【问题讨论】:

  • 我很困惑。如果鼠标超出曼哈顿长度,您是否希望保留单击功能并且仍然能够通过拖动来移动按钮?
  • 不,我想要的只是,当我拖动后释放按钮时,按钮状态变为正常“未选中”。如果您注意到,当您拖动按钮然后释放时,按钮仍然单击,我只想在释放后自动删除此单击。希望我能解释得更好

标签: python pyqt5 qwidget qpushbutton


【解决方案1】:

你在 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 信号。

【讨论】:

  • 不客气!请记住将答案标记为已接受(答案左侧的检查),因为它解决了您的问题。
猜你喜欢
  • 1970-01-01
  • 2018-05-17
  • 2014-11-17
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
相关资源
最近更新 更多