Как привязать конкретное дейтвие к виджетам QLabel, которые создаются в цикле?(PyQt5, Python3)
Я создал два файла Design.py и Main.py. В Design.py находится класс Label, единственный метод, которого создает и возвращает виджет QLabel, содержащий скругленное изображение. Фактически данный код не принадлежит мне - это объясняет то, что он работает:)
Я оставлю его тут, на всякий случай:
from PyQt5 import QtWidgets, QtGui, QtCore
class Label:
def create_label(self, picture):
self.label = QtWidgets.QLabel()
self.label.setMaximumSize(140, 140)
self.label.setMinimumSize(140, 140)
self.radius = 10
self.target = QtGui.QPixmap(self.label.size())
self.target.fill(QtCore.Qt.transparent)
p = QtGui.QPixmap(picture).scaled(140, 140, QtCore.Qt.KeepAspectRatioByExpanding, QtCore.Qt.SmoothTransformation)
painter = QtGui.QPainter(self.target)
painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
painter.setRenderHint(QtGui.QPainter.HighQualityAntialiasing, True)
painter.setRenderHint(QtGui.QPainter.SmoothPixmapTransform, True)
path = QtGui.QPainterPath()
path.addRoundedRect(0, 0, self.label.width(), self.label.height(), self.radius, self.radius)
painter.setClipPath(path)
painter.drawPixmap(0, 0, p)
self.label.setPixmap(self.target)
return self.label
Мой вопроc касается файла Main.py:
from PyQt5 import QtCore, QtWidgets, QtGui
import Design
list_ = ['1', '2', '3']
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.LabelCopy = Design.Label()
self.box1 = QtWidgets.QHBoxLayout()
self.setLayout(self.box1)
self.create_label()
def create_label(self):
for i in list_:
self.label = self.LabelCopy.create_label('picture2.png')
self.box1.addWidget(self.label)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle(' ')
window.show()
sys.exit(app.exec_())
Здесь у меня есть список list_. Для упрощения вопроса я наполнил его тремя цифрами и теперь хотел для каждой цифры создать QLabel, воспользовавшись методом create_label() класса Label, что находится в том самом файле Design.py. К этим виджетам я хотел привязать функции, которые будут выводить в консоль соответсвующую цифру. Т.е. чтобы QLabel, созданный в цикле первым, печатал первый элемент списка, второй QLabel - второй элемент списка и т.д. К сожалению, будучи очень ограниченным своих знаниях, я уже сижу час и не понимаю, как тут применить pyqtSignal() и mousePressEvent(). Пожалуйста, подскажите, как реализовать выше описанное?
Ответы (1 шт):
Когда вы создаете
label- наследуйте отQLabelв
classe Label- создаем сигналclicked = QtCore.pyqtSignal(str), который в качестве параметра передаст строкув методе
mouseReleaseEvent- имитируем испускание сигналаself.clicked.emit(self.num)в цикле создаем экземпляры
label = Label('head3.png', i)делаем привязку экземпляр-сигнал-слот
label.clicked.connect(lambda num=i: self.onClicked(num))с передачей в слот строки из списка.не надо использовать
list_как глобальную переменную.в слоте
def onClicked(self, value)печатаем то, что вы хотели.
from PyQt5 import QtCore, QtWidgets, QtGui
#import Design
#class Label:
# def create_label(self, picture):
class Label(QtWidgets.QLabel):
clicked = QtCore.pyqtSignal(str) # +++ 1
def __init__(self, picture, num, *args, **kwargs): # + picture, num
super(Label, self).__init__(*args, **kwargs)
#print(f'picture->{picture} - {num}')
self.num = num # +
# self.label = QtWidgets.QLabel() # убрал все self.label,
self.setMaximumSize(140, 140) # оставил self
self.setMinimumSize(140, 140)
self.radius = 10
self.target = QtGui.QPixmap(self.size())
self.target.fill(QtCore.Qt.transparent)
p = QtGui.QPixmap(picture).scaled(140, 140, QtCore.Qt.KeepAspectRatioByExpanding, QtCore.Qt.SmoothTransformation)
painter = QtGui.QPainter(self.target)
painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
painter.setRenderHint(QtGui.QPainter.HighQualityAntialiasing, True)
painter.setRenderHint(QtGui.QPainter.SmoothPixmapTransform, True)
path = QtGui.QPainterPath()
path.addRoundedRect(0, 0, self.width(), self.height(), self.radius, self.radius)
painter.setClipPath(path)
painter.drawPixmap(0, 0, p)
self.setPixmap(self.target)
# return self.label
def mouseReleaseEvent(self, event): # +++
self.clicked.emit(self.num) # +++ 2
#list_ = ['1', '2', '3']
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.list_ = ['1', '2', '3'] # +
# self.LabelCopy = Design.Label()
# self.LabelCopy = Label()
self.box1 = QtWidgets.QHBoxLayout(self)
# self.setLayout(self.box1)
# self.create_label()
# def create_label(self):
# for i in self.list_:
# self.label = self.LabelCopy.create_label('head3.png')
# self.box1.addWidget(self.label)
# ++ VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
for i in self.list_:
label = Label('head3.png', i) # + i !!! Внимание
label.clicked.connect(lambda num=i: self.onClicked(num)) # + 3
self.box1.addWidget(label)
def onClicked(self, value): # +++
print(f'value->{value}')
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle(' ')
window.show()
sys.exit(app.exec_())
