При нажатии на 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_())
