Drag and Drop часто пропускает DropEvent при запуске из PyCharm - PullRequest
0 голосов
/ 29 мая 2019

Я разрабатываю приложение PySide2, в котором я могу перетаскивать элементы из одной «корзины» в другую в PyCharm.

У меня есть грубый код, с которым я начал играть, и я могу что-то вродеПеретаскивайте элементы из одной корзины в другую, но это работает только в определенных ситуациях (я не мог определить, что заставляет его работать или нет. Кажется, что медленное перемещение мыши работает лучше, но не всегда, и, кажется, работает лучше ичем лучше, тем больше у него получилось).

Из приведенных здесь инструкций печати кажется, что иногда решается вызвать dragLeaveEvent вместо dropEvent.

Это происходит только тогда, когда приложение Qtзапускается из пичарма.Если я запускаю снаружи PyCharm, все работает нормально.

Я работаю на Linux, использую PySide2 5.12.0 PyCharm CE 2018.1.4 и Python 2.7.5.

Я тоже работаючерез VNC, что может повлиять на перетаскивание?Но у меня нет проблем в других приложениях / автономных.

class MyLabel(QtWidgets.QLabel):
    def __init__(self, text, parent=None):
        super(MyLabel, self).__init__(text, parent)

        self.setStyleSheet("""
           background-color: black;
           color: white;
           font: bold;
           padding: 6px;
           border-width: 2px;
           border-style: solid;
           border-radius: 16px;
           border-color: white;
       """)

    def mousePressEvent(self, event):
        itemData   = QtCore.QByteArray()
        dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.WriteOnly)
        dataStream.writeString(self.text())
        dataStream << QtCore.QPoint(event.pos() - self.rect().topLeft())

        mimeData = QtCore.QMimeData()
        mimeData.setData('application/MyWindow', itemData)
        mimeData.setText(self.text())

        drag = QtGui.QDrag(self)
        drag.setMimeData(mimeData)
        drag.setHotSpot(event.pos() - self.rect().topLeft())

        self.hide()
        drag.setPixmap(self.grab())

        if drag.exec_(QtCore.Qt.MoveAction | QtCore.Qt.CopyAction, QtCore.Qt.CopyAction) == QtCore.Qt.MoveAction:
            self.close()

        else:
            self.show()


class TrackBin(QtWidgets.QWidget):
    def __init__(self, track_name):
        super(TrackBin, self).__init__()
        layout = QtWidgets.QVBoxLayout()
        self.setLayout(layout)
        # Header
        header = QtWidgets.QFrame()
        header.setFrameStyle(header.StyledPanel | header.Raised)
        header.setLayout(QtWidgets.QHBoxLayout())
        header.layout().addWidget(QtWidgets.QLabel(track_name))

        layout.addWidget(header)

        # Content area (scrollable)
        self.bin_content = QtWidgets.QVBoxLayout()
        scroll_area = QtWidgets.QScrollArea()
        scroll_area.setWidgetResizable(True)
        scroll_area_widget = QtWidgets.QWidget()
        scroll_area_widget.setLayout(QtWidgets.QVBoxLayout())
        scroll_area_widget.layout().addLayout(self.bin_content)
        scroll_area_widget.layout().addStretch()
        scroll_area.setWidget(scroll_area_widget)
        for _i in range(5):
            self.bin_content.addWidget(MyLabel("some text"))

        layout.addWidget(scroll_area)

        self.setAcceptDrops(True)

    def dragEnterEvent(self, e):
        print "drag enter"
        e.accept()

    def dragLeaveEvent(self, e):
        print "drag leave"
        print e
        e.accept()

    def dropEvent(self, e):
        print e

        e.setDropAction(QtCore.Qt.MoveAction)
        e.accept()
        self.handle_drop(e)

    def handle_drop(self, e):
        print e
        print e.isAccepted()
        print e.source()
        # Was trying moving the event.source() directly but doesn't seem to work?
        self.bin_content.addWidget(MyLabel(e.source().text()))

(полный код здесь: https://pastebin.com/Jn9kgqM5)

Я ожидаю, что падение будет работать каждый раз, а не только случайно.

Кто-нибудь знает, как заставить его работать из pycharm? (Или у кого-то вообще такая же проблема)

...