Как открыть картинки в программе на PyQt5?

я искал много просмотрщиков фото, но меня они не устраивали, и я начал создавать свой на Python.

Знаю, это не очень хороший выбор ЯП, но дело не в этом. Я создал прозрачное полноэкранное окно с кнопкой закрытия, но никак не могу впихнуть туда картинку и я создал (точнее скопировал) код, который умеет открывать картинку но там я не могу реализовать свойства первой программы а это мне и нужно.

В общем КАК РЕАЛИЗОВАТЬ ОТКРЫТИЕ КАРТИНКИ В ПРОГРАММЕ КОТОРЫЙ Я СОЗДАЛ? кстати там даже есть виджет для этого

from PyQt5 import QtCore, QtWidgets


class UiMainWindow(object):
    def setup_ui(self, main_windows):
        main_windows.setObjectName("MainWindow")
        main_windows.resize(1366, 768)
        main_windows.setWindowOpacity(0.5)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(1316, 0, 50, 50))
        self.pushButton.setStyleSheet('''
        QPushButton {background-color: #636363; border-bottom-left-radius: 20; background-image: url(close.png) no-repeat;}
        QPushButton:hover {background-color: #969696;}
        QPushButton:pressed {background-color: #c7c7c7;}
        ''')
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(sys.exit)

        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(49, 49, 1271, 671))
        self.widget.setObjectName("widget")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslate_ui(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    @staticmethod
    def retranslate_ui(main_windows):
        _translate = QtCore.QCoreApplication.translate
        main_windows.setWindowTitle(_translate("MainWindow", "MainWindow"))


    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = UiMainWindow()
        ui.setup_ui(MainWindow)
        MainWindow.showFullScreen()
        sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

Виджет QLabel обеспечивает отображение текста или изображения.

Qt предоставляет четыре класса для обработки данных изображения: QImage, QPixmap, QBitmap и QPicture.
...
QPixmap разработан и оптимизирован для отображения изображений на экране.

вызываем метод setPixmap() для установки изображения.

Установите свое изображение здесь self.image = 'cat.jpg'

Запустите приложение и нажмите ЛКМ, ПКМ и посмотрите что происходит.

import sys
from PyQt5.Qt import *


class QLabelClickable(QLabel):
    clicked = pyqtSignal()
    def __init__(self, parent=None):
        super(QLabelClickable, self).__init__(parent)
        
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton: 
            self.clicked.emit()


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.centralWidget = QWidget() 
        self.setCentralWidget(self.centralWidget) 
        self.createActions()
        self.createMenus()
        self.createContextMenu()    
        
        self.labelImage = QLabelClickable(self)
        self.labelImage.setStyleSheet(
            "QLabel {background-color: write; border: 1px solid "
            "#0DFFD7; border-radius: 5px;}")
        self.labelImage.setAlignment(Qt.AlignCenter)
        self.labelImage.clicked.connect(self.imageClicked) 

        layout = QVBoxLayout(self.centralWidget)
        layout.addWidget(self.labelImage)

        self.image = 'cat.jpg'
        self.openImage(self.image)

    def createActions(self):
        self.openAct = QAction(QIcon("img/open.png"), "&Open...", self, shortcut="Ctrl+O",
                triggered=self.open)
        self.exitAct = QAction(QIcon("img/exit.png"), "E&xit", self, shortcut="Ctrl+Q",
                triggered=self.close)

    def createMenus(self):
        fileMenu = QMenu("&File", self)
        fileMenu.addAction(self.openAct)
        fileMenu.addSeparator()
        fileMenu.addAction(self.exitAct)
        self.menuBar().addMenu(fileMenu)
        
    def createContextMenu(self):
        self.centralWidget.setContextMenuPolicy(Qt.ActionsContextMenu)
        self.centralWidget.addAction(self.openAct)
        self.centralWidget.addAction(self.exitAct)

    def openImage(self, image):
        pixmapImage = QPixmap(image)
        pixmapImage = pixmapImage.scaled(
            300, 300,
            Qt.KeepAspectRatio,
            Qt.SmoothTransformation
        )
        self.labelImage.setPixmap(pixmapImage)    

    
    def open(self):
        fileName, _ = QFileDialog.getOpenFileName(
            self, 
            "Open Image", 
            QDir.currentPath(), 
            "Image Files (*.png *.jpg *.bmp)"
        )
        if fileName:
            self.image = fileName
            self.openImage(fileName)
            
    def imageClicked(self):                  
        self.window = QLabel()
        self.window.setPixmap(QPixmap(self.image))
        self.window.show()
        self.window.activateWindow()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.resize(300, 300)
    window.show()
    sys.exit(app.exec_())

введите сюда описание изображения


Update

... проблема в том что я не могу добавить сюда кнопки и прозрачное окно и т.д. Извините если я не совсем понятно изложил свои мысли.

Если это не займет много времени, не могли бы вы связать мой код и ваш в отдельных классах?

import sys
from PyQt5.Qt import *
from PyQt5 import QtCore, QtWidgets


class UiMainWindow(object):
    def setup_ui(self, main_windows):
        main_windows.setObjectName("MainWindow")
        main_windows.resize(800, 600)
        main_windows.setWindowOpacity(0.5)
        self.centralwidget = QtWidgets.QWidget(main_windows) #(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        """
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(200, 200, 50, 50))
        self.pushButton.setStyleSheet('''
        QPushButton {
            background-color: #636363; 
            border-bottom-left-radius: 20; 
            background-image: url(ball.png) no-repeat;
        }
        QPushButton:hover {background-color: #969696;}
        QPushButton:pressed {background-color: #c7c7c7;}
        ''')
        self.pushButton.setObjectName("pushButton")
#        self.pushButton.clicked.connect(sys.exit)
#        self.pushButton.clicked.connect(MainWindow.close)
        """

        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(49, 49, 700, 500))
        self.widget.setObjectName("widget")
        main_windows.setCentralWidget(self.centralwidget)         #MainWindow

        self.retranslate_ui(main_windows)
        QtCore.QMetaObject.connectSlotsByName(main_windows)

#    @staticmethod
    def retranslate_ui(self, main_windows):
        _translate = QtCore.QCoreApplication.translate
        main_windows.setWindowTitle( "MainWindow")


class QLabelClickable(QLabel):
    clicked = pyqtSignal()
    def __init__(self, parent=None):
        super(QLabelClickable, self).__init__(parent)
        
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton: 
            self.clicked.emit()


#class MainWindow(QMainWindow):
class MainWindow(QMainWindow, UiMainWindow):                          # +++ UiMainWindow
    def __init__(self):
        super().__init__()
        
        self.setup_ui(self)                                           # +++
        
#        self.centralwidget = QWidget() 
#        self.setCentralWidget(self.centralwidget) 
        self.createActions()
        self.createMenus()
        self.createContextMenu()    
        
        self.labelImage = QLabelClickable(self)
        self.labelImage.setStyleSheet(
            "QLabel {background-color: write; border: 1px solid "
            "#0DFFD7; border-radius: 5px;}")
        self.labelImage.setAlignment(Qt.AlignCenter)
        self.labelImage.clicked.connect(self.imageClicked) 
        
        botton = QPushButton('Это кнопка')
        botton.clicked.connect(lambda: print('Это кнопка !!!!!!!!!!!!'))

        layout = QVBoxLayout(self.centralwidget)
        layout.addWidget(self.labelImage)
        layout.addWidget(botton)

        self.image = 'cat.jpg'
        self.openImage(self.image)

    def createActions(self):
        self.openAct = QAction(QIcon("img/open.png"), "&Open...", self, shortcut="Ctrl+O",
                triggered=self.open)
        self.exitAct = QAction(QIcon("img/exit.png"), "E&xit", self, shortcut="Ctrl+Q",
                triggered=self.close)

    def createMenus(self):
        fileMenu = QMenu("&File", self)
        fileMenu.addAction(self.openAct)
        fileMenu.addSeparator()
        fileMenu.addAction(self.exitAct)
        self.menuBar().addMenu(fileMenu)
        
    def createContextMenu(self):
        self.centralwidget.setContextMenuPolicy(Qt.ActionsContextMenu)
        self.centralwidget.addAction(self.openAct)
        self.centralwidget.addAction(self.exitAct)

    def openImage(self, image):
        pixmapImage = QPixmap(image)
        pixmapImage = pixmapImage.scaled(
            300, 300,
            Qt.KeepAspectRatio,
            Qt.SmoothTransformation
        )
        self.labelImage.setPixmap(pixmapImage)    

    
    def open(self):
        fileName, _ = QFileDialog.getOpenFileName(
            self, 
            "Open Image", 
            QDir.currentPath(), 
            "Image Files (*.png *.jpg *.bmp)"
        )
        if fileName:
            self.image = fileName
            self.openImage(fileName)
            
    def imageClicked(self):                  
        self.window = QLabel()
        self.window.setPixmap(QPixmap(self.image))
        self.window.show()
        self.window.activateWindow()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.resize(300, 300)
    window.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка