pythonpyqtpyqt5qgraphicssceneqgraphicspixmapitem

QPixmap: How to increase the size of the picture in addPixmap?


class MyGraphicsView(QGraphicsView):
    def __init__(self):
        super(MyGraphicsView, self).__init__()
        scene = QGraphicsScene(self)
        self.tic_tac_toe = TicTacToe()
        scene.addItem(self.tic_tac_toe)

        self.m = QPixmap("exit.png")

        scene.addPixmap(self.m)

        self.setScene(scene)
        self.setCacheMode(QGraphicsView.CacheBackground)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)

The png is already there. What is the way to increase its size while showing it on the screen in scrollbars?

Aim is to have a button on whose click the size of this picture should increase.


Solution

  • You have to use setScale(). Also when you use addPixmap() this returns the created QGraphicsPixmapItem.

    In addition, the scaling is a transformation so it has a transformation origin, by default it is (0, 0), but in this case a better option would be to place it in the center of the image.

    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    from PyQt5.QtCore import *
    
    class MyGraphicsView(QGraphicsView):
        def __init__(self):
            super(MyGraphicsView, self).__init__()
            scene = QGraphicsScene(self)
            self.m = QPixmap("exit.png")
            self.item = scene.addPixmap(self.m)
    
            self.item.setTransformOriginPoint(self.item.boundingRect().center())
    
            self.setScene(scene)
            self.setCacheMode(QGraphicsView.CacheBackground)
            self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
            self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
    
        @pyqtSlot()
        def scale_pixmap(self):
            self.item.setScale(2*self.item.scale())
    
    class Example(QMainWindow):
        def __init__(self):
            super(Example, self).__init__()
            centralWidget = QWidget()
            self.setCentralWidget(centralWidget)
            lay = QVBoxLayout(centralWidget)
            gv = MyGraphicsView()
            button = QPushButton("scale")
            lay.addWidget(gv)
            lay.addWidget(button)
            button.clicked.connect(gv.scale_pixmap)
    
    
    if __name__ == '__main__':
        import sys
        app = QApplication(sys.argv)
        w = Example()
        w.show()
        sys.exit(app.exec_())