pyqt4 将图像设置为中央小部件

pyqt4 setting image as central widget

我正在尝试加载图像并将图像设置为我的 pyqt4 应用程序上的 centralwidget,但由于某种原因我看不到图像。

这是我的代码 -

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()     

更新代码:

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()     

canvas 是必须显示图像但您没有绘制图像的图像。你不认为这是问题所在吗?另一方面,您必须将滚动区域的 属性 widgetResizable 设置为 True。

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()   

另一方面,我不明白你为什么使用 open() 来加载图像,一个简单的任务需要很多行:

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()