2012-10-23 23 views
1

我正在使用PyQt中的應用程序。我用QWebView製作了UI,它用HTML頁面加載。如何捕捉一個文件事件被從桌面拖放到Qt(PyQt)應用程序中的QWebView使用javascript

此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捕獲這樣的事件?

回答

0

如果你的意思是說沒有執行D & D事件並讓JavaScript直接抓到它,那麼沒有。因爲QWebView必須接受D & D,然後向任何此類事件發送JavaScript信號。通過實現JS而在Chrome上工作的原因是,Chrome已經啓用並實現了D事件,然後將這些事件發送給JS。

類似於將任何QtGui元素的viewport設置爲acceptDrop或者元素的D事件不會被觸發。

+0

我會很高興繼續捕捉事件的Python代碼,但現在我唯一的解決方案是我用Python捕獲D&D事件,然後以某種方式獲得鼠標光標的X和Y位置。然後將X,Y和文件名傳遞給javascript,如下所示:'self.mainThread.view.page()。mainFrame()。evaluateJavaScript(code)'我不認爲這是正確的方法。 – Matej

相關問題