1

我正在开发 PyQt 中的应用程序。我用 QWebView 制作了 UI,它加载了一个 HTML 页面。

此 HTML 页面包含一个 javascript 代码,用于检测文件是否被放置在某个 DIV 上。

    $(document).ready(function() {
        jQuery.event.props.push('dataTransfer');


        $('.input').bind('drop', function(e) {
            var files = e.dataTransfer.files;
            alert(files[0].name);
        });
    });

如果我在 Chrome 中加载 HTML 代码,这可以正常工作。

如果我在 QWebView 中运行我的应用程序并 D&D 一个文件,则不会执行 JavaScript 代码。

我扩展了 QWebView 并添加了事件,因此我可以使用 python 捕获 D&D 事件。

class BrowserWindow(QtWebKit.QWebView):
def __init__(self, parent):
    super(BrowserWindow, self).__init__(parent)
    self.setAcceptDrops(True)

def dragEnterEvent(self, event):
    if event.mimeData().hasUrls:
        event.accept()
    else:
        event.ignore()

def dragMoveEvent(self, event):
    if event.mimeData().hasUrls:
        event.setDropAction(QtCore.Qt.CopyAction)
        event.accept()
    else:
        event.ignore()

def dropEvent(self, event):
    if event.mimeData().hasUrls:
        event.setDropAction(QtCore.Qt.CopyAction)
        event.accept()
        urls = event.mimeData().urls()
        print str(urls[0].toLocalFile())
    else:
        event.ignore()

是否可以选择在 QWebView 中直接使用 javascript 捕获此类事件?

4

1 回答 1

0

如果您的意思是说不用费心实现 D&D 事件并让 javascript 直接捕获它,那么没有. 因为 QWebView 必须接受 D&D,然后向 javascript 发出任何此类事件的信号。D&D 仅通过实现 JS 在 chrome 上工作的原因是 chrome 已经启用并实现了 D&D 事件,然后将其发送给 JS。

这类似于将viewport任何 QtGui 元素的设置为,acceptDrop否则不会触发该元素的 D&D 事件。

于 2012-10-24T07:03:44.520 回答