Я разрабатываю приложение 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? (Или у кого-то вообще такая же проблема)