Search code examples
pyqtpyqt4

pyqt4 setting image as central widget


Im trying to load a image and set the image as a centralwidget on my pyqt4 application but for some reason I dont see the image being visible.

Here is my code -

import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import QScrollArea

class Canvas(QtGui.QWidget):
    def __init__(self, *args, **kwargs):
        super(Canvas, self).__init__()
        self.pixmap = QtGui.QPixmap()

class Window(QtGui.QMainWindow):

    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle("PyQT tuts!")
        self.setWindowIcon(QtGui.QIcon('pythonlogo.png'))
        openFile = QtGui.QAction("&Open File", self)
        openFile.setShortcut("Ctrl+O")
        openFile.setStatusTip('Open File')
        openFile.triggered.connect(self.file_open)
        self.scrollarea = QScrollArea()
        self.statusBar()
        mainMenu = self.menuBar()

        fileMenu = mainMenu.addMenu('&File')
        fileMenu.addAction(openFile)                
        self.canvas = Canvas()
        self.home()

    def home(self):
        self.show()

    def file_open(self):
        name = QtGui.QFileDialog.getOpenFileName(self, 'Open File')
        file = open(name,'r')
        with file:
            imageData = file.read()        
            image = QtGui.QImage.fromData(imageData)
            self.load_pixmap(image)

    def load_pixmap(self, image):
        self.canvas.pixmap = QtGui.QPixmap.fromImage(image)
        self.scrollarea.setWidget(self.canvas)
        self.canvas.repaint()
        self.setCentralWidget(self.scrollarea)

    def close_application(self):        
        sys.exit()                

def run():
    app = QtGui.QApplication(sys.argv)
    GUI = Window()
    sys.exit(app.exec_())


run()     

Updated code:

import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import QScrollArea

class Canvas(QtGui.QWidget):
    def __init__(self, *args, **kwargs):
        super(Canvas, self).__init__()
        self.pixmap = QtGui.QPixmap()

    def paintEvent(self, event):        
            return super(Canvas, self).paintEvent(event)


class Window(QtGui.QMainWindow):

    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle("PyQT tuts!")
        self.setWindowIcon(QtGui.QIcon('pythonlogo.png'))
        openFile = QtGui.QAction("&Open File", self)
        openFile.setShortcut("Ctrl+O")
        openFile.setStatusTip('Open File')
        openFile.triggered.connect(self.file_open)
        self.scrollarea = QScrollArea()
        self.statusBar()
        mainMenu = self.menuBar()

        fileMenu = mainMenu.addMenu('&File')
        fileMenu.addAction(openFile)                
        self.canvas = Canvas()
        self.home()

    def home(self):
        self.show()

    def file_open(self):
        name = QtGui.QFileDialog.getOpenFileName(self, 'Open File')
        if name:
            self.load_pixmap(QtGui.QPixmap(name))

    def load_pixmap(self, pixmap):
        self.canvas.pixmap = pixmap
        self.scrollarea.setWidget(self.canvas)
        self.scrollarea.setWidgetResizable(True)
#         self.scrollarea.Raised
        self.canvas.repaint()
        self.setCentralWidget(self.scrollarea)

    def close_application(self):        
        sys.exit()                

def run():
    app = QtGui.QApplication(sys.argv)
    GUI = Window()
    sys.exit(app.exec_())


run()     

Solution

  • the canvas is the one that has to show the image but you are not painting it. Do not you think that is the problem? On the other hand you must set to True the property widgetResizable of the scrollarea.

    import sys
    from PyQt4 import QtGui, QtCore
    
    class Canvas(QtGui.QWidget):
        def __init__(self, *args, **kwargs):
            super(Canvas, self).__init__()
            self.pixmap = QtGui.QPixmap()
    
        def paintEvent(self, event):
            painter = QtGui.QPainter(self)
            painter.drawPixmap(QtCore.QPoint(), self.pixmap)
    
    class Window(QtGui.QMainWindow):
    
        def __init__(self):
            super(Window, self).__init__()
            self.setGeometry(50, 50, 500, 300)
            self.setWindowTitle("PyQT tuts!")
            self.setWindowIcon(QtGui.QIcon('pythonlogo.png'))
            openFile = QtGui.QAction("&Open File", self)
            openFile.setShortcut("Ctrl+O")
            openFile.setStatusTip('Open File')
            openFile.triggered.connect(self.file_open)
            self.scrollarea = QtGui.QScrollArea()
            self.statusBar()
            mainMenu = self.menuBar()
    
            fileMenu = mainMenu.addMenu('&File')
            fileMenu.addAction(openFile)                
            self.canvas = Canvas()
            self.home()
    
        def home(self):
            self.show()
    
        def file_open(self):
            name = QtGui.QFileDialog.getOpenFileName(self, 'Open File')
            file = open(name,'r')
            with file:
                imageData = file.read()        
                image = QtGui.QImage.fromData(imageData)
                print(image.isNull())
                self.load_pixmap(image)
    
        def load_pixmap(self, image):
            self.canvas.pixmap = QtGui.QPixmap.fromImage(image)
            self.scrollarea.setWidget(self.canvas)
            self.scrollarea.setWidgetResizable(True)
            self.setCentralWidget(self.scrollarea)            
    
    def run():
        app = QtGui.QApplication(sys.argv)
        GUI = Window()
        sys.exit(app.exec_())
    
    run()   
    

    On the other hand I do not understand why you use open() to load an image, many lines for a simple task:

    import sys
    from PyQt4 import QtGui, QtCore
    
    class Canvas(QtGui.QWidget):
        def __init__(self, *args, **kwargs):
            super(Canvas, self).__init__()
            self.pixmap = QtGui.QPixmap()
    
        def paintEvent(self, event):
            painter = QtGui.QPainter(self)
            painter.drawPixmap(QtCore.QPoint(), self.pixmap)
    
    class Window(QtGui.QMainWindow):
    
        def __init__(self):
            super(Window, self).__init__()
            self.setGeometry(50, 50, 500, 300)
            self.setWindowTitle("PyQT tuts!")
            self.setWindowIcon(QtGui.QIcon('pythonlogo.png'))
            openFile = QtGui.QAction("&Open File", self)
            openFile.setShortcut("Ctrl+O")
            openFile.setStatusTip('Open File')
            openFile.triggered.connect(self.file_open)
            self.scrollarea = QtGui.QScrollArea()
            self.statusBar()
            mainMenu = self.menuBar()
    
            fileMenu = mainMenu.addMenu('&File')
            fileMenu.addAction(openFile)                
            self.canvas = Canvas()
            self.home()
    
        def home(self):
            self.show()
    
        def file_open(self):
            name = QtGui.QFileDialog.getOpenFileName(self, 'Open File')
            if name:
                self.load_pixmap(QtGui.QPixmap(name))
    
        def load_pixmap(self, pixmap):
            self.canvas.pixmap = pixmap
            self.scrollarea.setWidget(self.canvas)
            self.scrollarea.setWidgetResizable(True)
            self.setCentralWidget(self.scrollarea)            
    
    def run():
        app = QtGui.QApplication(sys.argv)
        GUI = Window()
        sys.exit(app.exec_())
    
    run()