从PyCharm运行时,拖放操作通常会错过DropEvent

时间:2019-05-29 04:53:30

标签: python pycharm pyside2

我正在开发一个PySide2应用程序,可以在其中将项目从一个“容器”拖放到PyCharm中的另一个容器。

我开始使用一些粗糙的代码,可以将一个项目中的项目拖放到另一个项目中,但是它仅在某些情况下有效(我无法定义使它工作或不工作的原因。缓慢移动鼠标似乎更好,但并非总是如此,并且成功的次数越多,效果似乎越好。

从我放入的打印语句看来,有时它决定触发dragLeaveEvent而不是dropEvent。

这仅在从pycharm运行Qt App时发生。如果我从PyCharm外部运行,一切都会很好。

我正在使用PySide2 5.12.0 PyCharm CE 2018.1.4和Python 2.7.5在Linux上进行工作。

我也在通过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使其工作吗? (或者甚至有人遇到相同的问题)

0 个答案:

没有答案