Прежде чем указывать на решение, я просто собираюсь изменить имя класса AddRow на RowWidget, потому что класс не должен указывать действие.
class RowWidget(QtWidgets.QWidget):
def __init__( self, parent=None):
super(RowWidget, self).__init__(parent)
...
Как удалить последнюю добавленную строку?
Так как вы используете QFormLayout и предполагаете, что используете версию PyQt5> = 5.8, вы можете использовать метод removeRow () :
@QtCore.pyqtSlot()
def delWidget(self):
if self.scrollLayout.rowCount() > 0:
self.scrollLayout.removeRow(self.scrollLayout.rowCount()-1)
Как назначить действие кнопке (это можно сделать в классе AddRow likeself.buttton.clicked.callback (self.selectfile)?
Каждая часть вашего приложения должна быть независимой, поэтому выбранный вами слот должен быть частью только RowWidget, и RowWidget должен иметь метод, который возвращает это значение:
class RowWidget(QtWidgets.QWidget):
def __init__( self, parent=None):
super(RowWidget, self).__init__(parent)
self.button = QtWidgets.QPushButton('Select file')
self.label = QtWidgets.QLabel('Selection will go here')
self.lineedit = QtWidgets.QLineEdit()
self.lineedit.setPlaceholderText("Rename (optional)...")
self.button.clicked.connect(self.on_select_file)
layout = QtWidgets.QHBoxLayout(self)
layout.addWidget(self.button)
layout.addWidget(self.label)
layout.addWidget(self.lineedit)
@QtCore.pyqtSlot()
def on_select_file(self):
filename, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Open File")
if filename:
self.lineedit.setText(filename)
def get_filename(self):
return self.lineedit.text()
Как собрать данные из строк (т. Е. После нажатия кнопки «Принять»)?
Виджеты, прикрепленные к макету, являются дочерними элементами виджета, в который был добавлен макет, этот виджет можно получить с помощью parentWidget () , имея этого родителя, мы можем получить их потомков с помощью findChildren. () : * * тысяча двадцать-два
@QtCore.pyqtSlot()
def acceptValues(self):
l_values = []
for w in self.scrollLayout.parentWidget().findChildren(RowWidget):
l_values.append(w.get_filename())
print(l_values)
Предыдущий метод может завершиться ошибкой, если у parentWidget()
есть другие дочерние элементы, принадлежащие RowWidget
.
Еще один вариант, который не перестает работать, - это перебирать QLayoutItem
s:
@QtCore.pyqtSlot()
def acceptValues(self):
l_values = []
for i in range(self.scrollLayout.rowCount()):
layout_item = self.scrollLayout.itemAt(i)
if isinstance(layout_item.widget(), RowWidget):
l_values.append(layout_item.widget().get_filename())
print(l_values)