如何接收dropEvent时不是顶级窗口部件?

问题描述 投票:1回答:1

编辑:这个问题似乎是特定于Qt的版本5.12.0。详情参见和解决方法的答案

我想实现一个拖放区加载文件到我的应用程序。它的工作原理时,我只显示小工具作为顶级窗口部件,但它会停止,只要我包括到另一个父控件工作。

问题是,altough我收到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_()

什么任何线索被打破?是否父需要转发的情况下,如果是的话,我应该如何实现呢?

qt pyqt5 pyside2
1个回答
1
投票

它看起来就像是在Qt的5.12.0引入,将其固定在5.12.1 Qt的一个bug,请参阅this discussionbug report

同时:

这个问题可以通过重新实现dragMoveEvent(),接受事件有太多被合作周围。

即例如添加下面的方法来对FileDropZone类:

def dragMoveEvent(self, event):
    print("in drag move event")
    if event.mimeData().hasUrls():
        print("hasUrls()")
        event.acceptProposedAction()
© www.soinside.com 2019 - 2024. All rights reserved.