Hello World / plɹoM ollǝH

Programmers Live in Vain

PySide ドラッグでデータ受け渡し

f:id:dungeonneko:20170525143550g:plain

import sys
from PySide import QtCore, QtGui


# ドラッグ&ドロップで色を受け渡す
class WidgetItem(QtGui.QLabel):
    def __init__(self, color):
        super().__init__('')
        self._color = color
        self.setStyleSheet('border: 1px solid black;')
        self.setFixedSize(32, 32)
        self.setAcceptDrops(True)

    def paintEvent(self, event):
        self.changeColor()
        super().paintEvent(event)

    def changeColor(self):
        pal = QtGui.QPalette(self.palette())
        pal.setColor(QtGui.QPalette.Window, QtGui.QColor(self._color))
        self.setAutoFillBackground(True)
        self.setPalette(pal)

    def mousePressEvent(self, event):
        # ドラッグオブジェクトに色データ(テキスト)を埋め込んで実行
        drag = QtGui.QDrag(self)
        mime = QtCore.QMimeData()
        mime.setText(self._color)
        drag.setMimeData(mime)
        drag.exec_()

    def dragEnterEvent(self, event):
        event.accept()

    def dragMoveEvent(self, event):
        event.accept()

    def dropEvent(self, event):
        if event.mimeData().hasText():
            self._color = event.mimeData().text()
            self.changeColor()


app = QtGui.QApplication(sys.argv)

widget = QtGui.QWidget()
widget.setFixedSize(640, 240)
widget.setLayout(QtGui.QHBoxLayout())
layout = widget.layout()
layout.addWidget(WidgetItem('red'))
layout.addWidget(WidgetItem('blue'))
layout.addWidget(WidgetItem('green'))
layout.addWidget(WidgetItem('white'))
widget.show()
sys.exit(app.exec_())