找回密码
 立即注册
Qt开源社区 门户 查看内容

PyQT5 图片查看器

2019-10-25 06:24| 发布者: admin| 查看: 2287| 评论: 0

摘要: 一款简易的图片查看器。由官方PyQt4 demo升级为PyQt5版本,原本只有缩放功能,现另加入打印和拖放功能。源码如下:#!/usr/bin/env pythonfrom PyQt5 import QtCore, QtGui,QtWidgetsfrom PyQt5.QtPrintSupport impor ...
一款简易的图片查看器。由官方PyQt4 demo升级为PyQt5版本,原本只有缩放功能,现另加入打印和拖放功能。


源码如下:
    #!/usr/bin/env pythonfrom PyQt5 import QtCore, QtGui,QtWidgetsfrom PyQt5.QtPrintSupport import QPrinter, QPrintDialog,QPrintPreviewDialog
    classImageViewer(QtWidgets.QMainWindow):def__init__(self):super(ImageViewer, self).__init__()self.imageLabel = QtWidgets.QLabel()self.imageLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter)self.imageLabel.setBackgroundRole(QtGui.QPalette.Dark)self.imageLabel.setSizePolicy(QtWidgets.QSizePolicy.Ignored,QtWidgets.QSizePolicy.Ignored) #self.imageLabel.setSizePolicy(QtWidgets.QSizePolicy.Maximum,QtWidgets.QSizePolicy.Maximum)self.imageLabel.setScaledContents(True)self.scrollArea = QtWidgets.QScrollArea()self.scrollArea.setBackgroundRole(QtGui.QPalette.Dark)self.scrollArea.setWidget(self.imageLabel)self.setCentralWidget(self.scrollArea)self.createActions()self.createMenus()self.setAcceptDrops(True)#self.setWindowTitle("Image Viewer")self.resize(500, 400) def open(self): fileName,filetype = QtWidgets.QFileDialog.getOpenFileName(self, "Open File", QtCore.QDir.currentPath())if fileName: image = QtGui.QImage(fileName)if image.isNull(): QtWidgets.QMessageBox.information(self, "Image Viewer", "Cannot load %s." % fileName)returnself.imageLabel.setPixmap(QtGui.QPixmap.fromImage(image))self.scaleFactor = 1.0self.printAct.setEnabled(True)self.fitToWindowAct.setEnabled(True)self.updateActions()ifnotself.fitToWindowAct.isChecked():self.imageLabel.adjustSize() def dragEnterEvent(self, event):#拖动开始时,以及刚进入目标控件时调用 event.acceptProposedAction() #必须要有 def dropEvent(self, event):if event.mimeData().hasUrls(): urls=event.mimeData().urls() try: url=urls[0] fileName = str(url.toLocalFile())if fileName: image = QtGui.QImage(fileName)if image.isNull(): QtWidgets.QMessageBox.information(self, "Image Viewer", "Cannot load %s." % fileName)returnself.imageLabel.setPixmap(QtGui.QPixmap.fromImage(image))self.scaleFactor = 1.0self.printAct.setEnabled(True)self.fitToWindowAct.setEnabled(True)self.updateActions()ifnotself.fitToWindowAct.isChecked():self.imageLabel.adjustSize() except: passelse:super(ImageViewer, self).dropEvent(event) def handlePrint(self, printer):#打印 painter = QtGui.QPainter(printer)#使用painter 绘制文字、pixmap等在printer上 painter.setRenderHint(QtGui.QPainter.Antialiasing)#抗锯齿#可有可无 pix = self.imageLabel.pixmap() size = self.scaleFactor * pix.size() painter.drawPixmap(0, 0, size.width(), size.height(),pix) def printPreview(self):#打印预览 dialog = QPrintPreviewDialog() dialog.paintRequested.connect(self.handlePrint) dialog.exec_() def print_setup(self):#打印,无预览 printer = QPrinter() painter.setRenderHint(QPainter.Antialiasing)#抗锯齿 dialog = QPrintDialog(printer, self)if dialog.exec_() == QDialog.Accepted:self.handlePrint(printer)
    def zoomIn(self):self.scaleImage(1.25) def zoomOut(self):self.scaleImage(0.8) def normalSize(self):self.imageLabel.adjustSize()self.scaleFactor = 1.0 def fitToWindow(self): fitToWindow = self.fitToWindowAct.isChecked()self.scrollArea.setWidgetResizable(fitToWindow)ifnot fitToWindow:self.normalSize()self.updateActions() def about(self): QtWidgets.QMessageBox.about(self, "About Image Viewer", "<p>The <b>Image Viewer</b> example shows how to combine " "QLabel and QScrollArea to display an image. QLabel is " "typically used for displaying text, but it can also display " "an image. QScrollArea provides a scrolling view around " "another widget. If the child widget exceeds the size of the " "frame, QScrollArea automatically provides scroll bars.</p>" "<p>The example demonstrates how QLabel's ability to scale " "its contents (QLabel.scaledContents), and QScrollArea's " "ability to automatically resize its contents " "(QScrollArea.widgetResizable), can be used to implement " "zooming and scaling features.</p>" "<p>In addition the example shows how to use QPainter to " "print an image.</p>") def createActions(self):self.openAct = QtWidgets.QAction("&Open...", self, shortcut="Ctrl+O", triggered=self.open)self.printAct = QtWidgets.QAction("&Print...", self, shortcut="Ctrl+P", enabled=False, triggered=self.printPreview)self.exitAct = QtWidgets.QAction("E&xit", self, shortcut="Ctrl+Q", triggered=self.close)self.zoomInAct = QtWidgets.QAction("Zoom &In (25%)", self, shortcut="Ctrl++", enabled=False, triggered=self.zoomIn)self.zoomOutAct = QtWidgets.QAction("Zoom &Out (25%)", self, shortcut="Ctrl+-", enabled=False, triggered=self.zoomOut)self.normalSizeAct = QtWidgets.QAction("&Normal Size", self, shortcut="Ctrl+S", enabled=False, triggered=self.normalSize)self.fitToWindowAct = QtWidgets.QAction("&Fit to Window", self, enabled=False, checkable=True, shortcut="Ctrl+F", triggered=self.fitToWindow)self.aboutAct = QtWidgets.QAction("&About", self, triggered=self.about)self.aboutQtAct = QtWidgets.QAction("About &Qt", self, triggered=QtWidgets.qApp.aboutQt) def createMenus(self):self.fileMenu = QtWidgets.QMenu("&File", self)self.fileMenu.addAction(self.openAct)self.fileMenu.addAction(self.printAct)self.fileMenu.addSeparator()self.fileMenu.addAction(self.exitAct)self.viewMenu = QtWidgets.QMenu("&View", self)self.viewMenu.addAction(self.zoomInAct)self.viewMenu.addAction(self.zoomOutAct)self.viewMenu.addAction(self.normalSizeAct)self.viewMenu.addSeparator()self.viewMenu.addAction(self.fitToWindowAct)self.helpMenu = QtWidgets.QMenu("&Help", self)self.helpMenu.addAction(self.aboutAct)self.helpMenu.addAction(self.aboutQtAct)self.menuBar().addMenu(self.fileMenu)self.menuBar().addMenu(self.viewMenu)self.menuBar().addMenu(self.helpMenu) def updateActions(self):self.zoomInAct.setEnabled(notself.fitToWindowAct.isChecked())self.zoomOutAct.setEnabled(notself.fitToWindowAct.isChecked())self.normalSizeAct.setEnabled(notself.fitToWindowAct.isChecked()) def scaleImage(self, factor):self.scaleFactor *= factorself.imageLabel.resize(self.scaleFactor * self.imageLabel.pixmap().size())self.adjustScrollBar(self.scrollArea.horizontalScrollBar(), factor)self.adjustScrollBar(self.scrollArea.verticalScrollBar(), factor)self.zoomInAct.setEnabled(self.scaleFactor < 3.0)self.zoomOutAct.setEnabled(self.scaleFactor > 0.333) def adjustScrollBar(self, scrollBar, factor): scrollBar.setValue(int(factor * scrollBar.value() + ((factor - 1) * scrollBar.pageStep()/2)))

    if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) imageViewer = ImageViewer() imageViewer.show() sys.exit(app.exec_())

    ----------------------------------------------------------------------------------------------------------------------
    我们尊重原创,也注重分享,文章来源于微信公众号:Python可视化编程机器学习OpenCV,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
    ----------------------------------------------------------------------------------------------------------------------

    鲜花

    握手

    雷人

    路过

    鸡蛋
    
    公告
    可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了