Редактировать: эта проблема относится к версии Qt 5.12.0.См. Ответы для более подробной информации и обходного пути
Я пытаюсь создать зону перетаскивания для загрузки файлов в мое приложение.Это работает, когда я просто показываю виджет как виджет верхнего уровня, но перестает работать, как только я включаю его в другой родительский виджет.
Проблема в том, что, хотя я получаю dragEnterEvent
и, принимая его, я никогда не вижу dropEvent
.
Это мой виджет:
class FileDropZone(qt.QLabel):
"""Target area for a drag and drop operation"""
height = 33
def __init__(self, text="Add file", parent=None):
super().__init__(text, parent)
stylesheet = """
QLabel {
border: 2px dotted #B4BDBA;
qproperty-alignment: AlignCenter;
}
"""
self.setStyleSheet(stylesheet)
self.setAcceptDrops(True)
self.setFixedHeight(self.height)
def dragEnterEvent(self, event):
print("in drag enter event")
if event.mimeData().hasUrls():
print("hasUrls()")
event.acceptProposedAction()
def dropEvent(self, event):
print("in drop event")
urls = event.mimeData().urls()
for url in urls:
print(url.isLocalFile(), url.toLocalFile())
Вот как мне удается заставить это работать:
app = qt.QApplication([])
a = FileDropZone()
a.show()
app.exec_()
И это пример, где это не работает (dragEnter
работает, оба отпечатка распечатаны правильно, но dropEvent
ничего не печатает):
app = qt.QApplication([])
a0 = qt.QWidget()
l = qt.QHBoxLayout(a0)
a1 = FileDropZone("drop here", a0)
l.addWidget(a1)
a0.show()
app.exec_()
Есть какие-нибудь подсказки о том, что сломано?Должен ли родитель пересылать событие, и если да, то как мне его реализовать?