将本地图像拖动到我的应用程序

时间:2016-11-25 13:36:48

标签: python qt pyqt

发生的事情是以下问题:

  1. 我有自己的覆盖QGraphicsScene
  2. 我取代了我的方法,dragEnterEventdropEvent
  3. 当我从浏览器拖动图像时,例如从chrome中拖动图像,两者都被执行。 (PERFECT)
  4. 但是当我将图像从本地文件夹,从本地资源管理器拖到我的应用程序内部时,只执行了 dragEnterEvent ,而不是我的 dropEvent
  5. 我的方法是在我的 dragEnterEvent 内部,我处理QPixMap创建和本地保存,并在我的 dropEvent 中,我会将此图像添加到我的 QGraphicsScene
  6. 我想知道如何让dropEvent捕获事件并在我的场景中删除本地图像时执行。
  7. 以下是我目前的情况:

    我的dragEnterEvent:

    def dragEnterEvent(self, q_graphics_scene_drag_drop_event):
        q_graphics_scene_drag_drop_event.acceptProposedAction()
        try:
            if q_graphics_scene_drag_drop_event.mimeData().hasUrls():
                print('LOCAL / CHROME')
                url = str(q_graphics_scene_drag_drop_event.mimeData().urls()[0].url())
                data = urllib.request.urlopen(url).read()
                image = QImage()
                image.loadFromData(data)
                self.browser_img = QPixmap(image)
                self.browser_img.save("resources/my_image.png")
                print("LOCAL / CHROME finalized")
            else:
                print("WEBVIEW")
                html = q_graphics_scene_drag_drop_event.mimeData().html()
                matches = re.search('src="([^"]+)"', html)
                url = matches.group()[5:-1]
                print(url)
                data = urllib.request.urlopen(url).read()
                image = QImage()
                image.loadFromData(data)
                self.browser_img = QPixmap(image)
                self.browser_img.save("resources/my_image.png")
                print("WEBVIEW finalized")
        except:
    
            print('error',sys.exc_info())
            self.update()
    
        # HERE I CAN USE THE CODE OF THE DROPEVENT, BUT EACH TIME THAT I
        # GET OUT AND GET INSIDE MY SCENE THE IMAGE WILL BE ADDED AGAIN.
        # I DON'T WANT THAT.
        # self.graphics_image = QGraphicsPixmapItem(self.browser_img)
        # self.graphics_image.setFlags(QGraphicsItem.ItemIsSelectable)
        # self.graphics_image.setFlags(QGraphicsItem.ItemIsMovable)
        # self.addItem(self.graphics_image)
        # self.graphics_image.setPos(q_graphics_scene_drag_drop_event.scenePos())
    

    我的dropEvent:

    def dropEvent(self, event):
        # HERE IS THE WORKING CODE BUT ONLY EXECUTED WHEN IMAGE DRAGGED FROM
        # BROWSER, NOT EXECUTED WHEN FROM A LOCAL FOLDER.
        self.graphics_image = QGraphicsPixmapItem(self.browser_img)
        self.graphics_image.setFlags(QGraphicsItem.ItemIsSelectable)
        self.graphics_image.setFlags(QGraphicsItem.ItemIsMovable)
        self.addItem(self.graphics_image)
        # QGraphicsSceneDragDropEvent.screenPos()
        self.graphics_image.setPos(event.scenePos())
        super(InteractQGraphicsScene, self).dropEvent(event)
    

    在我看来,我还设置了接受,使用:

    self.setAcceptDrops(True)
    

    使代码完美运行,网址申请,图片创建,图片添加。 再次,唯一的问题是当地文件夹没有执行的拖延事件。

1 个答案:

答案 0 :(得分:1)

我终于得到了问题的答案。

  1. 我做了一个小例子,看看是什么问题。
  2. 只需在视图上实现dragEnterEvent,dropEvent并接受放置事件就可以了。( 如果我只有视图和默认场景
  3. 由于我有自己的个性化场景,我必须做以下事情:
  4. 重新实现dragEnterEvent和dragMoveEvent,并在场景中接受他们的事件。
  5. 在视图上实现我的最终逻辑。
  6. 现在一切都很完美:D
  7. 视图上的“举报”:

    self.setAcceptDrops(True)
    

    查看:

     def dragEnterEvent(self, q_graphics_scene_drag_drop_event):
    
        q_graphics_scene_drag_drop_event.accept()
        q_graphics_scene_drag_drop_event.acceptProposedAction()
        try:
            if q_graphics_scene_drag_drop_event.mimeData().hasUrls():
                print("local chrome")
                url = str(q_graphics_scene_drag_drop_event.mimeData().urls()[0].url())
                NAM_CREATOR.get_nam().request_image(url)
            else:
                print("webview")
                html = q_graphics_scene_drag_drop_event.mimeData().html()
                matches = re.search('src="([^"]+)"', html)
                url = matches.group()[5:-1]
                NAM_CREATOR.get_nam().request_image(url)
        except RuntimeError:
            print('error',sys.exc_info())
            pass
        super(ScreenViewScene, self).dragEnterEvent(
            q_graphics_scene_drag_drop_event)
    
    def dragMoveEvent(self, QDragMoveEvent):
        QDragMoveEvent.accept()
        super(ScreenViewScene, self).dragMoveEvent(QDragMoveEvent)
    
    def dropEvent(self, event):
        print("LEAVE")
        image = QPixmap("resources/browser_images/image_required_browser")
        self.graphics_image = QGraphicsPixmapItem(image)
        self.graphics_image.acceptDrops()
        self.graphics_image.setFlags(QGraphicsItem.ItemIsSelectable)
        self.graphics_image.setFlags(QGraphicsItem.ItemIsMovable)
        self.scene.addItem(self.graphics_image)
        self.graphics_image.setPos(event.pos())
        NAM_CREATOR.get_nam().deleteLater()
        NAM_CREATOR.reset_nam()
    
        super(ScreenViewScene, self).dropEvent(event)
    

    <强>场景:

    def dragEnterEvent(self, QGraphicsSceneDragDropEvent):
        QGraphicsSceneDragDropEvent.accept()
    
    def dragMoveEvent(self, QGraphicsSceneDragDropEvent):
        QGraphicsSceneDragDropEvent.accept()