Как создать ряд форм в PyQt5?
Имеется код, создающий форму, совмещающую в себе свойство кнопки (при клике выполняется функция) и одновременно можно выполнять изменение текста внутри.
Но возникает проблема расстановки множества таких форм, можно конечно создать несколько переменных и выполнять одни и те же действия с ними, но это много одного и того же повторяющегося кода.
Подскажите, пожалуйста, способ расстановки нескольких форм сразу без повторяющегося кода.
Вот сам код:
import sys
import random
from PyQt5 import QtCore, QtGui, QtWidgets
class Label(QtWidgets.QLabel):
clicked = QtCore.pyqtSignal()
doubleClicked = QtCore.pyqtSignal()
def __init__(self, parent=None):
super(Label, self).__init__(parent)
self.resize(100, 100)
self.setText("Hello World")
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
self.clicked.emit()
def mouseDoubleClickEvent(self, event):
if event.button() == QtCore.Qt.RightButton:
self.doubleClicked.emit()
class Test(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.resize(500, 500)
self.setObjectName('test')
self.label = Label(self)
self.label.setWordWrap(True)
self.color = QtGui.QColor(*random.sample(range(255), 3)).name()
self.label.setStyleSheet(f"background-color: {self.color}")
self.label.clicked.connect(self.onClicked)
self.label.doubleClicked.connect(self.onDoubleClicked)
self.lineEdit = QtWidgets.QLineEdit(self)
self.lineEdit.editingFinished.connect(self.editFinished)
self.lineEdit.setGeometry(self.label.geometry())
self.lineEdit.hide()
def onClicked(self):
self.color = QtGui.QColor(*random.sample(range(255), 3)).name()
self.label.setStyleSheet(f"background-color: {self.color}")
def onDoubleClicked(self):
self.lineEdit.setText(self.label.text())
self.lineEdit.setStyleSheet(f"background-color: {self.color}")
self.lineEdit.show()
self.lineEdit.setFocus()
def editFinished(self):
self.label.setText(self.lineEdit.text())
self.lineEdit.hide()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = Test()
w.show()
sys.exit(app.exec_())
И примерное фото множества таких форм:

Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Попробуйте так:
import sys
import random
from PyQt5 import QtCore, QtGui, QtWidgets
class Label(QtWidgets.QLabel):
clicked = QtCore.pyqtSignal()
doubleClicked = QtCore.pyqtSignal()
def __init__(self, parent=None):
super(Label, self).__init__(parent)
self.resize(100, 100)
self.setText("Hello World")
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
self.clicked.emit()
def mouseDoubleClickEvent(self, event):
if event.button() == QtCore.Qt.RightButton:
self.doubleClicked.emit()
class Widget(QtWidgets.QWidget): # +++
def __init__(self):
super().__init__()
self.setMinimumHeight(100)
self.label = Label(self)
self.label.setWordWrap(True)
self.color = QtGui.QColor(*random.sample(range(255), 3)).name()
self.label.setStyleSheet(f"background-color: {self.color}")
self.label.clicked.connect(self.onClicked)
self.label.doubleClicked.connect(self.onDoubleClicked)
self.lineEdit = QtWidgets.QLineEdit(self)
self.lineEdit.editingFinished.connect(self.editFinished)
self.lineEdit.setGeometry(self.label.geometry())
self.lineEdit.hide()
def onClicked(self):
self.color = QtGui.QColor(*random.sample(range(255), 3)).name()
self.label.setStyleSheet(f"background-color: {self.color}")
def onDoubleClicked(self):
self.lineEdit.setText(self.label.text())
self.lineEdit.setStyleSheet(f"background-color: {self.color}")
self.lineEdit.show()
self.lineEdit.setFocus()
def editFinished(self):
self.label.setText(self.lineEdit.text())
self.lineEdit.hide()
class Test(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.resize(500, 500)
self.setObjectName('test')
widget = Widget() # +++
btn = QtWidgets.QPushButton("Add Widget")
btn.clicked.connect(self.onClickButton)
self.row, self.column = 0, 0
self.grid = QtWidgets.QGridLayout(self)
self.grid.addWidget(widget, self.row, self.column)
self.grid.addWidget(btn, 10, 0, 1, 4)
def onClickButton(self):
self.column += 1
widget = Widget() # +++
self.grid.addWidget(widget, self.row, self.column)
if self.column == 3:
self.column = -1
self.row += 1
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = Test()
w.show()
sys.exit(app.exec_())
