2014-09-11 3 views
0

Я хочу перетащить изображение из браузера, но не могу получить URL-адрес!Как перетаскивать изображения из Chrome в PyQt?

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

Этот код хорошо работает с изображениями из Firefox (но иногда я получаю ссылку на изображение не источник URL изображения - У меня уже есть представление о том, как это исправить).

Однако тот же код возвращает пустой список, когда я перетаскиваю изображение из Chrome.

Итак, в чем проблема?


Я попытался draging изображения по умолчанию QlineEdit виджета, и ЦСИ URL был сброшен автоматически, как 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

может двигаться само изображение, которое имеет 'изображение/*' MimeType Qt имеет класс, чтобы вытащить тех, в –

+0

@ratchetfreak я попробовал это, но то же самое. Я добавляю некоторую информацию, которая может быть полезна для моего вопроса. – PaleNeutron

ответ

0

Все данные перетащить & падение QWidget (в PyQt) он должен быть общие типы MIME (QtCore.QMimeData). Это данные возможности не URL (text/uri-list), как в вашей проблеме, возможно, MIME см. Изображение (image/ *), но не увидеть URL (но иногда он видит как URL, так и изображение). Но, вы можете получить данные изображения от QtCore.QMimeData напрямую;

Вы можете попробовать, воспользуйтесь методом bool QMimeData.hasImage (self), чтобы проверить тип изображения. И положите изображение на QImage по телефону QVariant QMimeData.imageData (self), см. Пример, как реализовать;

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

+0

И я добавил некоторую информацию к моему вопросу. – PaleNeutron

+0

Ваше мнение, что он хорошо работает в вашей среде с python27 и pyqt4, но не работает в python34 pyqt5? Очень странно. Это возможность Google Chrome использует разные MIME изображения? Не могли бы вы рассказать мне о своей среде? Благодарю. –

0

Chrome и Firefox используют различные форматы дополнительные пантомимы при перетаскивании что-то из них. Вы можете просмотреть все форматы пантомиму с

print(ev.mimeData().formats) 

Вы можете перетащить изображение из хрома с этим фрагментом.

if ev.mimeData().hasFormat("application/octet-stream"): 
    image = QImage() 
    image.loadFromData(ev.mimeData().data("application/octet-stream")) 
Смежные вопросы