不是***小部件时如何接收dropEvent?

Posted

技术标签:

【中文标题】不是***小部件时如何接收dropEvent?【英文标题】:How to receive dropEvent when not a top level widget? 【发布时间】:2019-02-07 08:48:33 【问题描述】:

编辑:这个问题似乎特定于 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_()

关于损坏的任何线索?父母是否需要转发事件,如果需要,我应该如何实现?

【问题讨论】:

太棒了Minimal, Complete, and Verifiable example。 【参考方案1】:

看起来这是 Qt 5.12.0 中引入的错误,将在 Qt 5.12.1 中修复,请参阅 this discussion 和 bug report。

同时:

可以通过重新实现 dragMoveEvent() 并在那里接受事件来解决该问题。

即添加例如FileDropZone 类的以下方法:

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

【讨论】:

谢谢!解决方法修复它。我将编辑我的问题以向读者说明我的 Qt 版本。

以上是关于不是***小部件时如何接收dropEvent?的主要内容,如果未能解决你的问题,请参考以下文章

使用 QtDesigner PyQt4 创建自定义小部件

它是如何工作的whatsapp

Dojo 选择小部件验证

Qt4:从 QDockedWidget 的子类访问 QtDesigner 创建的小部件

如何在 Qt 表单类中调整 OpenGL 小部件的大小

每个选项卡小部件的 PyQt 选项