在 pyqt5 中使用 qpageview 拖放功能

Drag and drop functionality using qpageview in pyqt5

我在 pyqt5 中使用 qpageview(参见 here and here)来创建一个文档查看器,它可以查看 pdf、jpg、png 和 svg 文件作为更大项目的一部分。目前为止的代码如下,只是一个window打开pdf/jpg/png/svg文件

import sys
import os
import glob

from PyQt5.QtCore import QDir
from PyQt5.QtWidgets import (QMainWindow, QApplication, QMenu, QVBoxLayout,
    QWidget, QAction, QFileDialog)
from PyQt5.QtGui import (QIcon, QKeySequence)
import qpageview

class MainWindow(QMainWindow):
    
    """Main Window."""

    def __init__(self, *args, **kwargs):
        """Initializer."""

        super(MainWindow,self).__init__(*args, **kwargs)

        self.window_title = 'Document Viewer'
        self.setWindowTitle(self.window_title)
        self.resize(600,450)

        widget = QWidget()
        self.setCentralWidget(widget)

        self.layout = QVBoxLayout()
        widget.setLayout(self.layout)

        self._createImageViewer()
        self._createMenu()

    def _createImageViewer(self):

        self.viewer = qpageview.View()
        self.layout.addWidget(self.viewer)
        self.viewer.show()

        return

    def _createMenu(self):
        self.file_menu  = self.menuBar().addMenu("&File")

        # File submenu
        self.openFileAction = QAction(QIcon.fromTheme('document-open'), 
            '&Open', self, shortcut = QKeySequence.Open, 
            triggered = self.openFile)
        self.file_menu.addAction(self.openFileAction)

    def openFile(self):
        fileName, _ = QFileDialog().getOpenFileName(self,
            "Open Documents", QDir.currentPath(), 
            "PDF (*.pdf)" 
            + ";;" + "PNG (*.png)"
            + ";;" + "JPEG (*.jpg *.jpeg)"
            + ";;" + "SVG (*.svg)"
            )

        if fileName:

            ext = os.path.splitext(fileName)[1]

            if ext == '.pdf':
                self.viewer.loadPdf(fileName)

            elif ext == '.jpg' or ext == '.jpeg' or ext == '.png':
                self.viewer.loadImages(glob.glob(fileName))
                
            elif ext == '.svg':
                self.viewer.loadSvgs(glob.glob(fileName))
                
            self.viewer.setViewMode(qpageview.FitWidth)

if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_()) 

但是,我还需要拖放功能,可以将图像文件 (png/jpg) 从该应用程序拖到另一个外部应用程序。我知道如何使用 QLabel() 执行此操作,并且我知道这种功能也可用于 qpageview 使用 QDrag(参见 here)。但是,我不是专家,不知道如何进行。任何帮助将不胜感激。

好吧,我终于成功地将一个png图像拖到另一个外部应用程序中了。所以就在 openFile(self) 函数之后(见我原来的问题),我添加了以下两个函数,现在它可以工作了。我还必须在导入模块的顶部添加 from qpageview.export import ImageExporter

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drag_start_position = event.pos()

    def mouseMoveEvent(self, event):
        if not (event.buttons() & Qt.LeftButton):
            return

        if (event.pos() - self.drag_start_position).manhattanLength() < QApplication.startDragDistance():
            return

        page = self.viewer.currentPage()
        if page:
            exporter = ImageExporter(page)
            mimedata = exporter.mimeData()
            exporter.drag(self,mimedata)