我正在开发一个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使其工作吗? (或者甚至有人遇到相同的问题)