При нажатии на Label можно выбрать фотографию, которую туда загрузить

Есть ли возможность при нажатии на пустое место где предусмотрен label открывался проводник и можно было выбрать фото для дальнейшей работы?

На данный момент реализовано это через menuBar, но хотелось бы от него избавится.

Main.py

import sys

from PyQt5.QtWidgets import (QApplication, QDialog, QMainWindow, QMessageBox)
from PyQt5.uic import loadUi
from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *

from ui import Ui_MainWindow


class Window(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        self.ui2 = Ui_MainWindow()
        self.ui2.setupUi(self)

        mainMenu = self.menuBar()
        file = mainMenu.addMenu("Файл")   
        photo = QAction("Вставить фото", self)
        file.addAction(photo)
        photo.triggered.connect(self.getImage)

        self.selection = QRubberBand(QRubberBand.Rectangle, self) 
    
    def getImage(self):
        filename, _ = QFileDialog.getOpenFileName(
            self, 
            "Выберите изображение", 
            "",
            "All Files(*.*);;PNG(*.png);;JPEG(*.jpg *.jpeg)"
        )
        if not filename:
            return
        self.ui2.label.setPixmap(QPixmap(u"{}".format(filename)))
        self.selection.hide()  

if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec_())

ui.py

from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(502, 499)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.label = QLabel(self.centralwidget)
        self.label.setObjectName(u"label")
        self.label.setGeometry(QRect(20, 20, 361, 431))
        self.label.setTextFormat(Qt.MarkdownText)
        self.label.setScaledContents(True)
        self.label.setStyleSheet('border-style: solid; border-width: 1px; border-color: black;')
        self.label.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter)
        self.label.setMargin(-3)
        self.label.setOpenExternalLinks(False)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 502, 22))
        MainWindow.setMenuBar(self.menubar)

        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
        self.label.setText("")
    # retranslateUi

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

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

Вам надо создать класс, который наследуется от QLabel. Создать в нем сигнал и переопределить метод mousePressEvent. Далее вы встраиваете этот класс в форму Qt Designer.

import sys
from PyQt5.Qt import *

#from ui import Ui_MainWindow
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(502, 499)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.label = Label(self.centralwidget)                       # - QLabel, + Label   !!!
        self.label.setObjectName(u"label")
        self.label.setGeometry(QRect(20, 20, 361, 431))
        self.label.setTextFormat(Qt.MarkdownText)
        self.label.setScaledContents(True)
        self.label.setStyleSheet('border-style: solid; border-width: 1px; border-color: black;')
        self.label.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignVCenter)
        self.label.setMargin(-3)
        self.label.setOpenExternalLinks(False)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 502, 22))
        MainWindow.setMenuBar(self.menubar)

        self.retranslateUi(MainWindow)
        QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
        self.label.setText("")

        
class Label(QLabel):
    clicked = pyqtSignal()                                             # +++
    
    def __init__(self, parent=None):
        super().__init__(parent)
        
    def mousePressEvent(self, event):
        self.clicked.emit()                                            # +++
        

class Window(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
#?        self.setupUi(self)
        self.ui2 = Ui_MainWindow()
        self.ui2.setupUi(self)

        mainMenu = self.menuBar()
        file = mainMenu.addMenu("Файл")   
        photo = QAction("Вставить фото", self)
        file.addAction(photo)
        photo.triggered.connect(self.getImage)
#?        self.selection = QRubberBand(QRubberBand.Rectangle, self) 

        self.ui2.label.clicked.connect(self.getImage)                  # +++

    
    def getImage(self):
        filename, _ = QFileDialog.getOpenFileName(
            self, 
            "Выберите изображение", 
            "",
            "All Files(*.*);;PNG(*.png);;JPEG(*.jpg *.jpeg)"
        )
        if not filename:
            return
        self.ui2.label.setPixmap(QPixmap(u"{}".format(filename)))
#?        self.selection.hide()  


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec_())

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

→ Ссылка