Hello World / plɹoM ollǝH

Programmers Live in Vain

PySide drag start from QPushButton

Qt (PySide) は一部のWidget以外でドラッグ開始を実装しようとすると意外と面倒
ググると大体受け入れる側のサンプル出てきちゃうし

class MyButton(QPushButton):
    def __init__(self, parent):
        super().__init__(parent)
        self._startPos = QPoint()

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self._startPos = event.pos()
        super().mousePressEvent(event)

    def mouseMoveEvent(self, event):
        if 0 != (event.buttons() & Qt.LeftButton):
            if (event.pos() - self._startPos).manhattanLength() >= QApplication.startDragDistance():
                self.startDrag()
                self.setDown(False)
                return
        super().mouseMoveEvent(event)

    def startDrag(self):
        drag = QDrag(self)
        mime = QMimeData(self)
        mime.setText('hogehoge')
        drag.setMimeData(mime)
        drag.start(Qt.CopyAction)

QToolButtonなどでも同様
mousePressEvent, mouseMoveEventあたりが継承できるWidgetはこれでいけそう