Откройте и сохраните файл изображения с помощью меню в PyQt5 - PullRequest
0 голосов
/ 13 мая 2018

Я написал следующий код для открытия файла изображения с помощью меню в PyQt5. Он может выбрать файл, но не может отобразить его в окне. Я успешно открыл текстовый файл, но не могу сделать то же самое для изображений. Можете ли вы исправить мою ошибку?

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QLabel, QFileDialog, QAction
from PyQt5.QtGui import QIcon, QPixmap

class MainWindow(QMainWindow):

    def __init__(self, parent = None):
        super(MainWindow, self).__init__(parent)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('File')
        editMenu = menubar.addMenu('Edit')
        self.resize(500, 500)

        dlg = QFileDialog(self)       
        openAction = QAction('Open Image', self)  
        openAction.triggered.connect(self.openImage) 
        fileMenu.addAction(openAction)

        closeAction = QAction('Exit', self)  
        closeAction.triggered.connect(self.close) 
        fileMenu.addAction(closeAction)



    def openImage(self):
    # This function is called when the user clicks File->Open Image.
        label = QLabel(self)
        filename = QFileDialog.getOpenFileName()
        imagePath = filename[0]
        print(imagePath)
        pixmap = QPixmap(imagePath)
        label.setPixmap(pixmap)
        self.resize(pixmap.width(),pixmap.height())
        self.show()



def main():
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    app.exec_()

if __name__ == '__main__':
    sys.exit(main()) 

1 Ответ

0 голосов
/ 13 мая 2018

Когда вы вызываете show(), виджет делает видимыми дочерние элементы, в вашем случае QLabel не является дочерним при использовании этого метода, поэтому простое, но частичное решение состоит в том, чтобы сделать его видимым:

def openImage(self):
    label = QLabel(self)
    label.show()
    # or
    # self.show()

Но в случае QMainWindow это не подходит, QMainWindow является очень специальным виджетом, потому что он имеет определенную структуру, как показано на следующем изображении:

enter image description here

Как вы можете видеть, QLabel является центральным виджетом и создает его только один раз, а затем вам нужно только заменить QPixmap, если вы выберете новое изображение:

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel, QFileDialog, QAction
from PyQt5.QtGui import QPixmap

class MainWindow(QMainWindow):

    def __init__(self, parent = None):
        super(MainWindow, self).__init__(parent)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('File')
        editMenu = menubar.addMenu('Edit')
        self.resize(500, 500)

        openAction = QAction('Open Image', self)  
        openAction.triggered.connect(self.openImage) 
        fileMenu.addAction(openAction)

        closeAction = QAction('Exit', self)  
        closeAction.triggered.connect(self.close) 
        fileMenu.addAction(closeAction)
        self.label = QLabel()
        self.setCentralWidget(self.label)

    def openImage(self):
        imagePath, _ = QFileDialog.getOpenFileName()
        pixmap = QPixmap(imagePath)
        self.label.setPixmap(pixmap)
        self.resize(pixmap.size())
        self.adjustSize()

def main():
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    return app.exec_()

if __name__ == '__main__':
    sys.exit(main()) 
...