Thanks SGaist,
I'm too new to this to fully understand what you've said. I'm not sure how to set a dynamic property but I have seen references to sender methods - I'll have to do some further reading for that. Also not sure where I'd put the lambda you suggest or how to use QSignalMapper (more reading I guess!).
However, I found that by defining the "delBtn" inside the row it belongs to, instead of creating it outside and then adding it, the deleteRow (now renamed to zapRow) slot function operates on its own row.
from os import linesep
import sys
from PySide2 import QtWidgets, QtGui
from PySide2.QtCore import Signal, Slot
from PySide2.QtGui import QColor, QFont, QPalette, Qt, qBlue
from PySide2.QtWidgets import (
QApplication,
QFileDialog,
QFormLayout, QFrame,
QHBoxLayout,
QLabel,
QLineEdit,
QMessageBox,
QPushButton, QSpacerItem,
QVBoxLayout,
)
myList = [ {"name": "mn", "phone": "2806" },
{"name": "ts", "phone": "2800" },
{"name": "mb", "phone": "2801" }
]
outRow = QFormLayout()
class nestedLayouts(QtWidgets.QWidget):
def __init__(self):
super().__init__()
mainLt = QVBoxLayout()
for l in myList:
outRow.addRow(delBtn(outRow.rowCount()), newRow(l))
outRow.addRow(addBtn(outRow.rowCount()))
mainLt.addLayout(outRow)
self.setLayout(mainLt)
class delBtn(QPushButton):
def __init__(self, row):
super().__init__()
self.num = row
self.setText(f"Delete this row")
self.clicked.connect(self.zapRow)
@Slot()
def zapRow(self):
row = outRow.getWidgetPosition(self)[0]
print("deleting a row...", row)
outRow.removeRow(self)
print(f"delBtn {row} deleted, outRow count = {outRow.rowCount()}")
class addBtn(QPushButton):
def __init__(self, row):
super().__init__()
self.num = row
self.setText(f"Add a row")
self.clicked.connect(self.newRow)
@Slot()
def newRow(self):
row = outRow.getWidgetPosition(self)[0]
outRow.insertRow(row, delBtn(row), newRow({"name": "?", "phone": "?"}))
class newRow(QFormLayout):
def __init__(self, pList):
super().__init__()
self.pList = pList
for name, phone in pList.items():
print(name, phone)
label = QLabel(name)
field = QLineEdit()
field.setText(phone)
self.addRow(label, field)
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setStyle("windowsvista")
nest = nestedLayouts()
nest.resize(800, 300)
nest.show()
sys.exit(app.exec_())