Функциональность перетаскивания с использованием qpageview в pyqt5

#python #drag-and-drop #pyqt5

#python #перетаскивание #pyqt5

Вопрос:

Я использую qpageview (см. Здесь и Здесь) в pyqt5 для создания средства просмотра документов, которое может просматривать файлы pdf, jpg, png и svg как часть более крупного проекта. Пока что код выглядит следующим образом, это просто окно для открытия файла 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("amp;File")

        # File submenu
        self.openFileAction = QAction(QIcon.fromTheme('document-open'), 
            'amp;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 (см. Здесь ). Однако я не эксперт и не знаю, как поступить. Любая помощь будет оценена.

Комментарии:

1. Если вы знаете, как это сделать с помощью QLabel, это не должно сильно отличаться для этого средства просмотра. Вероятно, вам потребуется подкласс qpageview.View и переопределить mouseMoveEvent .

2. @musicamante: Я уже пытался это сделать. Но, к сожалению, я не знаю, как получить pixmap mimedata информацию и qpageview.View , и поэтому не смог этого сделать.

Ответ №1:

Хорошо, мне наконец удалось перетащить изображение 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() amp; 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)