在 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)
我在 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)