Вы должны заказать свой код, и лучший способ - использовать классы.В этом случае виджет (QLineEdit + QPushButton) должен быть классом и предоставлять сигнал нажатия кнопки через сигнал, принадлежащий классу.
Таким же образом создается другой класс, который обрабатывает QListWidget, чтобыполучить строку кнопки, задача которой состоит в том, чтобы использовать геометрию, в этом случае мы получим виджет, используя sender () (sender () возвращает объект, выдавший сигнал), а затем позицию верхнего левого угла этоговиджет получается относительно экрана с помощью mapToGlobal (), эта глобальная позиция преобразуется в локальную позицию относительно viewport () QListWidget с помощью mapFromGlobal (), затем, используя локальную позицию, мы получаем элемент с помощью itemAt ()и с элементом задача проста.
PyQt4:
import sys
from PyQt4 import QtGui, QtCore
class Widget(QtGui.QWidget):
clicked = QtCore.pyqtSignal()
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
line_edit = QtGui.QLineEdit()
delete_button = QtGui.QPushButton("Delete Row")
hlay = QtGui.QHBoxLayout(self)
hlay.addWidget(line_edit)
hlay.addWidget(delete_button)
delete_button.clicked.connect(self.clicked)
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setWindowTitle("PoC ListWidget")
tab_widget = QtGui.QTabWidget()
work_tab = QtGui.QWidget()
tab_widget.addTab(work_tab, 'Tab.01')
self.others_commands_widget = QtGui.QListWidget()
add_button = QtGui.QPushButton("Add")
add_button.clicked.connect(self.add_other_command)
vlay = QtGui.QVBoxLayout(work_tab)
vlay.addWidget(add_button, alignment=QtCore.Qt.AlignLeft)
vlay.addWidget(self.others_commands_widget)
self.setCentralWidget(tab_widget)
@QtCore.pyqtSlot()
def add_other_command(self):
it = QtGui.QListWidgetItem()
self.others_commands_widget.addItem(it)
widget = Widget()
widget.clicked.connect(self.remove_other_command)
self.others_commands_widget.setItemWidget(it, widget)
it.setSizeHint(widget.sizeHint())
@QtCore.pyqtSlot()
def remove_other_command(self):
widget = self.sender()
gp = widget.mapToGlobal(QtCore.QPoint())
lp = self.others_commands_widget.viewport().mapFromGlobal(gp)
row = self.others_commands_widget.row(self.others_commands_widget.itemAt(lp))
t_it = self.others_commands_widget.takeItem(row)
del t_it
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
PyQt5:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Widget(QtWidgets.QWidget):
clicked = QtCore.pyqtSignal()
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
line_edit = QtWidgets.QLineEdit()
delete_button = QtWidgets.QPushButton("Delete Row")
hlay = QtWidgets.QHBoxLayout(self)
hlay.addWidget(line_edit)
hlay.addWidget(delete_button)
delete_button.clicked.connect(self.clicked)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setWindowTitle("PoC ListWidget")
tab_widget = QtWidgets.QTabWidget()
work_tab = QtWidgets.QWidget()
tab_widget.addTab(work_tab, 'Tab.01')
self.others_commands_widget = QtWidgets.QListWidget()
add_button = QtWidgets.QPushButton("Add")
add_button.clicked.connect(self.add_other_command)
vlay = QtWidgets.QVBoxLayout(work_tab)
vlay.addWidget(add_button, alignment=QtCore.Qt.AlignLeft)
vlay.addWidget(self.others_commands_widget)
self.setCentralWidget(tab_widget)
@QtCore.pyqtSlot()
def add_other_command(self):
it = QtWidgets.QListWidgetItem()
self.others_commands_widget.addItem(it)
widget = Widget()
widget.clicked.connect(self.remove_other_command)
self.others_commands_widget.setItemWidget(it, widget)
it.setSizeHint(widget.sizeHint())
@QtCore.pyqtSlot()
def remove_other_command(self):
widget = self.sender()
gp = widget.mapToGlobal(QtCore.QPoint())
lp = self.others_commands_widget.viewport().mapFromGlobal(gp)
row = self.others_commands_widget.row(self.others_commands_widget.itemAt(lp))
t_it = self.others_commands_widget.takeItem(row)
del t_it
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())