Как получить dropEvent, когда не виджет верхнего уровня? - PullRequest
0 голосов
/ 07 февраля 2019

Редактировать: эта проблема относится к версии 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_()

Есть какие-нибудь подсказки о том, что сломано?Должен ли родитель пересылать событие, и если да, то как мне его реализовать?

1 Ответ

0 голосов
/ 07 февраля 2019

Похоже, что это ошибка, которая была введена в Qt 5.12.0 и будет исправлена ​​в Qt 5.12.1, смотрите это обсуждение и этот отчет об ошибках .

А пока:

Проблему можно обойти, переопределив dragMoveEvent () и приняв там событие тоже.

т.е. добавьте, например, следующий методв FileDropZone класс:

def dragMoveEvent(self, event):
    print("in drag move event")
    if event.mimeData().hasUrls():
        print("hasUrls()")
        event.acceptProposedAction()
...