2014-09-11 61 views
0

我想從瀏覽器拖動圖片但無法獲取網址!如何將圖片從Chrome拖拽到PyQt?

if ev.mimeData().hasUrls(): 
    ev.mimeData().urls() 

此代碼與圖像效果很好從Firefox(但我有時會收到的圖像不是圖像的源URL的鏈接 - 我已經有一個想法如何解決它)。

但是,當我從Chrome拖動圖像時,相同的代碼返回空列表。

那麼,什麼問題?


我試圖draging圖像默認QlineEdit小部件,以及src網址滴入全自動Firefox和Chrome瀏覽器!

----

實驗結果:

PyQt4 - Python 2.7.6 (default, Mar 22 2014, 22:59:56) [GCC 4.8.2] on linux2 (Ubuntu 14.04) 

Firefox 32.0       : Only work with URL, I can't found image type. 
Google chrome Version 37.0.2062.120 (64-bit) : URL is empty and no images founded. 

PyQt5 Python 3.4.0 (default, Apr 11 2014, 13:05:11) [GCC 4.8.2] on linux2 (Ubuntu14.04) 
the same 
+0

可以移動它有一個'圖像/ *'MIME類型Qt擁有一個類來拉那些 – 2014-09-11 09:34:44

+0

@ratchetfreak我已經試過了圖像本身,而是相同的。我添加了一些可能對我的問題有幫助的信息。 – PaleNeutron 2014-09-12 08:49:40

回答

0

所有數據拖動QWidget &下降(PyQt的)它必須是共同的MIME類型(QtCore.QMimeData)。這可能性數據不是URL(text/uri-list),就像你的問題一樣,它可能只是MIME類型的圖像(image/ *),看不到URL(但有時它會看到URL和圖像)。但是,您可以直接從QtCore.QMimeData獲取圖像數據;

你可以試試,使用方法bool QMimeData.hasImage (self)檢查類型是圖像。並通過調用QVariant QMimeData.imageData (self)將圖像放入QImage,參見示例如何實現;

import sys 
from PyQt4 import QtGui 

class QCustomQWidget (QtGui.QWidget): 
    def __init__ (self, parentQWidget = None): 
     super(QCustomQWidget, self).__init__(parentQWidget) 
     self.mimeQLabel = QtGui.QLabel() 
     allQHBoxLayout = QtGui.QHBoxLayout() 
     allQHBoxLayout.addWidget(self.mimeQLabel) 
     self.setLayout(allQHBoxLayout) 
     self.setAcceptDrops(True) 

    def dragEnterEvent (self, eventQDragEnterEvent): 
     eventQDragEnterEvent.acceptProposedAction() 

    def dropEvent (self, eventQDropEvent): 
     self.mimeQLabel.clear() 
     if eventQDropEvent.mimeData().hasImage(): 
      mimeQImage = QtGui.QImage(eventQDropEvent.mimeData().imageData()) 
      self.mimeQLabel.setPixmap(QtGui.QPixmap.fromImage(mimeQImage)) 
     elif eventQDropEvent.mimeData().hasUrls(): 
      self.mimeQLabel.setText('\n'.join([str(url) for url in eventQDropEvent.mimeData().urls()])) 
     QtGui.QWidget.dropEvent(self, eventQDropEvent) 

app = QtGui.QApplication(sys.argv) 
myQCustomQWidget = QCustomQWidget() 
myQCustomQWidget.show() 
sys.exit(app.exec_()) 

實驗結果:

PyQt4 - Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32 

Firefox 31.0       : Image & URL work fine. 
Google chrome Version 37.0.2062.103 m : Only work with URL, I can't found image type. 
+0

你的代碼工作的很好,但是當我將它移植到'python3.4.0'和'PyQt5'時失敗。任何建議? – PaleNeutron 2014-09-12 10:37:38

+0

我已經添加了一些信息給我的問題。 – PaleNeutron 2014-09-12 10:38:32

+0

你說你的環境python27&pyqt4,但在python34 pyqt5失敗嗎?很奇怪。這可能是谷歌鉻是使用不同的MIME圖像?你可以請你談談你的環境嗎?謝謝。 – 2014-09-12 11:29:33

0

Chrome和Firefox使用不同的附加MIME格式時,你從他們拖到什麼。 您可以檢查所有的MIME格式的

print(ev.mimeData().formats) 

您可以在這個片段中,從鍍鉻拖動圖像。

if ev.mimeData().hasFormat("application/octet-stream"): 
    image = QImage() 
    image.loadFromData(ev.mimeData().data("application/octet-stream"))