40122


pythin3.5を使っています。現在pyqt5の勉強中です。次のコードでファイルから表示した画像の拡大拡小などをControl＋やControl-
で行えるように書いてあるようなのですが、Control＋をしても画像が拡大されません。Control-
での拡小は問題なく行えます。しかし一体何がダメなのか分かりません。

[code]

    from PyQt5.QtCore import QDir, Qt
    from PyQt5.QtGui import QImage, QPainter, QPalette, QPixmap
    from PyQt5.QtWidgets import (QAction, QApplication, QFileDialog, QLabel,
            QMainWindow, QMenu, QMessageBox, QScrollArea, QSizePolicy)
    from PyQt5.QtPrintSupport import QPrintDialog, QPrinter
    
    
    class ImageViewer(QMainWindow):
        def __init__(self):
            super(ImageViewer, self).__init__()
    
            self.printer = QPrinter()
            self.scaleFactor = 0.0
    
            self.imageLabel = QLabel()
            self.imageLabel.setBackgroundRole(QPalette.Base)
            self.imageLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
            self.imageLabel.setScaledContents(True)
    
            self.scrollArea = QScrollArea()
            self.scrollArea.setBackgroundRole(QPalette.Dark)
            self.scrollArea.setWidget(self.imageLabel)
            self.setCentralWidget(self.scrollArea)
    
            self.createActions()
            self.createMenus()
    
            self.setWindowTitle("Image Viewer")
            self.resize(500, 400)
    
        def open(self):
            fileName, _ = QFileDialog.getOpenFileName(self, "Open File",
                    QDir.currentPath())
            if fileName:
                image = QImage(fileName)
                if image.isNull():
                    QMessageBox.information(self, "Image Viewer",
                            "Cannot load %s." % fileName)
                    return
    
                self.imageLabel.setPixmap(QPixmap.fromImage(image))
                self.scaleFactor = 1.0
    
                self.printAct.setEnabled(True)
                self.fitToWindowAct.setEnabled(True)
                self.updateActions()
    
                if not self.fitToWindowAct.isChecked():
                    self.imageLabel.adjustSize()
    
        def print_(self):
            dialog = QPrintDialog(self.printer, self)
            if dialog.exec_():
                painter = QPainter(self.printer)
                rect = painter.viewport()
                size = self.imageLabel.pixmap().size()
                size.scale(rect.size(), Qt.KeepAspectRatio)
                painter.setViewport(rect.x(), rect.y(), size.width(), size.height())
                painter.setWindow(self.imageLabel.pixmap().rect())
                painter.drawPixmap(0, 0, self.imageLabel.pixmap())
    
        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)
            if not fitToWindow:
                self.normalSize()
    
            self.updateActions()
    
        def about(self):
            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 = QAction("&Open...", self, shortcut="Ctrl+O",
                    triggered=self.open)
    
            self.printAct = QAction("&Print...", self, shortcut="Ctrl+P",
                    enabled=False, triggered=self.print_)
    
            self.exitAct = QAction("E&xit", self, shortcut="Ctrl+Q",
                    triggered=self.close)
    
            self.zoomInAct = QAction("Zoom &In (25%)", self, shortcut="Ctrl++",
                    enabled=False, triggered=self.zoomIn)
    
            self.zoomOutAct = QAction("Zoom &Out (25%)", self, shortcut="Ctrl+-",
                    enabled=False, triggered=self.zoomOut)
    
            self.normalSizeAct = QAction("&Normal Size", self, shortcut="Ctrl+S",
                    enabled=False, triggered=self.normalSize)
    
            self.fitToWindowAct = QAction("&Fit to Window", self, enabled=False,
                    checkable=True, shortcut="Ctrl+F", triggered=self.fitToWindow)
    
            self.aboutAct = QAction("&About", self, triggered=self.about)
    
            self.aboutQtAct = QAction("About &Qt", self,
                    triggered=QApplication.instance().aboutQt)
    
        def createMenus(self):
            self.fileMenu = QMenu("&File", self)
            self.fileMenu.addAction(self.openAct)
            self.fileMenu.addAction(self.printAct)
            self.fileMenu.addSeparator()
            self.fileMenu.addAction(self.exitAct)
    
            self.viewMenu = 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 = 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(not self.fitToWindowAct.isChecked())
            self.zoomOutAct.setEnabled(not self.fitToWindowAct.isChecked())
            self.normalSizeAct.setEnabled(not self.fitToWindowAct.isChecked())
    
        def scaleImage(self, factor):
            self.scaleFactor *= factor
            self.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 = QApplication(sys.argv)
        imageViewer = ImageViewer()
        imageViewer.show()
        sys.exit(app.exec_())
    
[/code]


CC BY-SA 3.0
2017-12-08T00:35:11.423
40120
2021-03-09T04:52:59.180
2021-03-09T04:52:59.180
26529
26529
question
python python3 pyqt5
pyqt5でControl＋＋での操作が行われない


手元の環境ではこれでも動いていますが、たぶん [Keyboard Layout
Issues](http://doc.qt.io/qt-5/qkeysequence.html#keyboard-layout-issues)
で説明されている問題でしょう。  
対応としては、

  * `shortcut="Ctrl+Shift+;"` のように特定のキーボードレイアウトを前提とする
  * `shortcut=QKeySequence.ZoomIn` のように[標準ショートカット](http://doc.qt.io/qt-5/qkeysequence.html#StandardKey-enum)を使う  
（`QKeySequence` は `PyQt5.QtGui` から `import` します）

のどちらかになると思います。


CC BY-SA 3.0
2017-12-08T01:44:47.343
40122
2017-12-08T01:44:47.343
3054
40120
answer