Когда вы вызываете show()
, виджет делает видимыми дочерние элементы, в вашем случае QLabel не является дочерним при использовании этого метода, поэтому простое, но частичное решение состоит в том, чтобы сделать его видимым:
def openImage(self):
label = QLabel(self)
label.show()
# or
# self.show()
Но в случае QMainWindow это не подходит, QMainWindow является очень специальным виджетом, потому что он имеет определенную структуру, как показано на следующем изображении:
Как вы можете видеть, 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())