#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)