Как получить индекс элемента в listwidget по нажатию кнопки в нём. Pyside6
Мне требуется получить индекс элемента в listwidget при нажатии кнопки в нём.
Ожидание: я нажимаю кнопку (не элемент) в item 5 и получаю ответ что это 5 item.
Реальность: Я получаю только индекс последнего элемента (19) скорее всего это потому что i уже прошел цикл.
Как можно подключить кнопку так, чтобы она всегда выдавала индекс элемента?
Минимально воспроизводимый пример: (сделан лишь как пример, могут быть ошибки)
import sys
from PySide6 import QtWidgets
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient)
from PySide6.QtWidgets import *
class Ui_Form(object):
def setupUi(self, Form):
if not Form.objectName():
Form.setObjectName(u"Form")
Form.resize(291, 53)
self.horizontalLayout = QHBoxLayout(Form)
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.label = QLabel(Form)
self.label.setObjectName(u"label")
self.label.setMinimumSize(QSize(200, 20))
self.horizontalLayout.addWidget(self.label)
self.pushButton = QPushButton(Form)
self.pushButton.setObjectName(u"pushButton")
self.pushButton.setMinimumSize(QSize(50, 20))
self.horizontalLayout.addWidget(self.pushButton)
self.retranslateUi(Form)
QMetaObject.connectSlotsByName(Form)
# setupUi
def retranslateUi(self, Form):
Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
self.label.setText(QCoreApplication.translate("Form", u"\u0422\u0443\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0442\u0435\u043a\u0441\u0442", None))
self.pushButton.setText(QCoreApplication.translate("Form", u"PushButton", None))
# retranslateUi
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.gridLayout = QGridLayout(self.centralwidget)
self.gridLayout.setObjectName(u"gridLayout")
self.listWidget = QListWidget(self.centralwidget)
self.listWidget.setObjectName(u"listWidget")
self.gridLayout.addWidget(self.listWidget, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow)
self.menubar.setObjectName(u"menubar")
self.menubar.setGeometry(QRect(0, 0, 800, 22))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName(u"statusbar")
MainWindow.setStatusBar(self.statusbar)
QMetaObject.connectSlotsByName(MainWindow)
class TestWidget(QtWidgets.QMainWindow, Ui_Form):
def __init__(self, parent=None):
super(TestWidget, self).__init__(parent)
self.setupUi(self)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
# retranslateUi
def setText(self, text):
self.label.setText(text)
def sizeHint(self):
return QSize(200, 40)
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
for i in range(20):
testwidget = TestWidget()
item = QtWidgets.QListWidgetItem(self.listWidget)
testwidget.setText(f"Это элемент {i}")
testwidget.pushButton.clicked.connect(lambda: self.test(i))
item.setSizeHint(testwidget.sizeHint())
self.listWidget.addItem(item)
self.listWidget.setItemWidget(item, testwidget)
def test(self, i):
print("Элемент", i)
if __name__ == "__main__":
if not QtWidgets.QApplication.instance():
app = QtWidgets.QApplication(sys.argv)
else:
app = QtWidgets.QApplication.instance()
window = MainWindow()
window.show()
sys.exit(app.exec())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я отметил для вас две шибки, которые вы допустили. Спросите если что-то не понятно.
import sys
'''
from PySide6 import QtWidgets
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient)
from PySide6.QtWidgets import *
'''
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class Ui_Form(object):
def setupUi(self, Form):
if not Form.objectName():
Form.setObjectName(u"Form")
Form.resize(291, 53)
self.horizontalLayout = QHBoxLayout(Form)
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.label = QLabel(Form)
self.label.setObjectName(u"label")
self.label.setMinimumSize(QSize(200, 20))
self.horizontalLayout.addWidget(self.label)
self.pushButton = QPushButton(Form)
self.pushButton.setObjectName(u"pushButton")
self.pushButton.setMinimumSize(QSize(50, 20))
self.horizontalLayout.addWidget(self.pushButton)
self.retranslateUi(Form)
QMetaObject.connectSlotsByName(Form)
# setupUi
def retranslateUi(self, Form):
Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
self.label.setText(QCoreApplication.translate("Form", u"\u0422\u0443\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0442\u0435\u043a\u0441\u0442", None))
self.pushButton.setText(QCoreApplication.translate("Form", u"PushButton", None))
# retranslateUi
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.gridLayout = QGridLayout(self.centralwidget)
self.gridLayout.setObjectName(u"gridLayout")
self.listWidget = QListWidget(self.centralwidget)
self.listWidget.setObjectName(u"listWidget")
self.gridLayout.addWidget(self.listWidget, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow)
self.menubar.setObjectName(u"menubar")
self.menubar.setGeometry(QRect(0, 0, 800, 22))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName(u"statusbar")
MainWindow.setStatusBar(self.statusbar)
QMetaObject.connectSlotsByName(MainWindow)
#class TestWidget(QtWidgets.QMainWindow, Ui_Form):
# vvvvvvv
class TestWidget(QtWidgets.QWidget, Ui_Form): # +++
def __init__(self, parent=None):
super(TestWidget, self).__init__(parent)
self.setupUi(self)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
# retranslateUi
def setText(self, text):
self.label.setText(text)
def sizeHint(self):
return QSize(200, 40)
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
for i in range(20):
testwidget = TestWidget()
item = QtWidgets.QListWidgetItem(self.listWidget)
testwidget.setText(f"Это элемент {i}")
# +++
# testwidget.pushButton.clicked.connect(lambda: self.test(i))
testwidget.pushButton.clicked.connect(lambda ch, i=i: self.test(i)) # +++
item.setSizeHint(testwidget.sizeHint())
self.listWidget.addItem(item)
self.listWidget.setItemWidget(item, testwidget)
def test(self, i):
print("Элемент", i)
if __name__ == "__main__":
if not QtWidgets.QApplication.instance():
app = QtWidgets.QApplication(sys.argv)
else:
app = QtWidgets.QApplication.instance()
window = MainWindow()
window.show()
sys.exit(app.exec())
