Назначение номера виджету Pyside6 setText

Пытаюсь разобраться с Pyside6. Стоит задача добавлять по нажатию кнопки виджет на layout главного окна и присваивать ему порядковый номер.

На виджете же есть кнопка удаления, по нажатию которой виджет должен, собственно, удаляться, а остальные виджеты перенумеровываться.

Пробую сейчас играться с "self.ui.layout_f.count", но в таком случае если, к примеру, удалить четвертый из пяти виджетов, а затем снова нажать на кнопку добавить, то на слое будет два виджета с номером 5.

Как я понимаю весь вопрос в алгоритме для setText, в функции press_del_f, который будет переназначать виджетам их номер.

mainwindow.py:

from PySide6.QtWidgets import QMainWindow
from PySide6.QtCore import Slot

from ui_mainwindow import Ui_MainWindow
from form_f import Form_f


class MainWindow(QMainWindow):

    def __init__ (self):
        super(MainWindow, self).__init__()
        self.ui=Ui_MainWindow()
        self.ui.setupUi(self)
   
        self.ui.add_but_f.clicked.connect(self.addf)
   
    @Slot() #Добавление виджета ф
    def addf (self):
        self.id_f = self.ui.layout_f.count () +1
        form_f = Form_f(self.id_f)
        self.ui.layout_f.addWidget(form_f)
        form_f.delete_f.connect(self.delete_form_f)

    @Slot(int) #Функция удаления виджета Ф
    def delete_form_f(self, wid: int):
        print(f'Виджет удален ({wid})f')
        widget_f = self.sender()
        self.ui.layout_f.removeWidget(widget_f)
        widget_f.deleteLater()    

form_f.py:

from PySide6.QtWidgets import QWidget
from PySide6.QtCore import Slot, Signal

from base_ui.ui_form_f import Ui_Form_f


class Form_f(QWidget):
    delete_f = Signal(int)
    
    def __init__(self, id_widget_f: int, parent=None):
        super(Form_f, self).__init__(parent)
        self.ui = Ui_Form_f()
        self.ui.setupUi(self)
        self.id_widget_f = id_widget_f      
        self.ui.label_id_f.setText(str(id_widget_f))
        self.ui.deleteButton_f.clicked.connect(self.press_del_f)
        
    @Slot()
    def press_del_f(self):
        self.delete_f.emit(self.id_widget_f)
        

ui_mainwindow.py

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, QTransform)
from PySide6.QtWidgets import (QApplication, QGridLayout, QMainWindow, QPushButton,
    QSizePolicy, QVBoxLayout, QWidget)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(319, 291)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.gridLayout = QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName(u"gridLayout")
        self.layout = QVBoxLayout()
        self.layout.setObjectName(u"layout")

        self.gridLayout.addLayout(self.layout, 0, 0, 1, 1)

        self.add_but = QPushButton(self.centralwidget)
        self.add_but.setObjectName(u"add_but")

        self.gridLayout.addWidget(self.add_but, 1, 0, 1, 1)

        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
        self.add_but.setText(QCoreApplication.translate("MainWindow", u"PushButton", None))

ui_form_f.py

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, QTransform)
from PySide6.QtWidgets import (QApplication, QDoubleSpinBox, QGroupBox, QHBoxLayout,
    QLabel, QPushButton, QSizePolicy, QSpacerItem,
    QVBoxLayout, QWidget)
import res_rc

class Ui_Form_f(object):
    def setupUi(self, Form_f):
        if not Form_f.objectName():
            Form_f.setObjectName(u"Form_f")
        Form_f.resize(375, 63)
        Form_f.setMinimumSize(QSize(375, 63))
        Form_f.setMaximumSize(QSize(400, 66))
        font = QFont()
        font.setFamilies([u"FreeSerif"])
        font.setPointSize(12)
        Form_f.setFont(font)
        self.verticalLayout_f = QVBoxLayout(Form_f)
        self.verticalLayout_f.setObjectName(u"verticalLayout_f")
        self.groupBox_f = QGroupBox(Form_f)
        self.groupBox_f.setObjectName(u"groupBox_f")
        self.horizontalLayout = QHBoxLayout(self.groupBox_f)
        self.horizontalLayout.setObjectName(u"horizontalLayout")
        self.label_id_f = QLabel(self.groupBox_f)
        self.label_id_f.setObjectName(u"label_id_f")
        self.label_id_f.setMinimumSize(QSize(135, 0))
        font1 = QFont()
        font1.setFamilies([u"FreeSerif"])
        font1.setPointSize(17)
        self.label_id_f.setFont(font1)
        self.label_id_f.setLayoutDirection(Qt.LeftToRight)
        self.label_id_f.setAlignment(Qt.AlignCenter)

        self.horizontalLayout.addWidget(self.label_id_f)

        self.horizontalSpacer_f = QSpacerItem(56, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)

        self.horizontalLayout.addItem(self.horizontalSpacer_f)

        self.resultBox_f = QDoubleSpinBox(self.groupBox_f)
        self.resultBox_f.setObjectName(u"resultBox_f")
        self.resultBox_f.setMinimumSize(QSize(100, 0))

        self.horizontalLayout.addWidget(self.resultBox_f)

        self.deleteButton_f = QPushButton(self.groupBox_f)
        self.deleteButton_f.setObjectName(u"deleteButton_f")
        self.deleteButton_f.setMinimumSize(QSize(25, 25))
        icon = QIcon()
        icon.addFile(u":/close.png", QSize(), QIcon.Normal, QIcon.Off)
        self.deleteButton_f.setIcon(icon)

        self.horizontalLayout.addWidget(self.deleteButton_f)


        self.verticalLayout_f.addWidget(self.groupBox_f)


        self.retranslateUi(Form_f)

        QMetaObject.connectSlotsByName(Form_f)
    # setupUi

    def retranslateUi(self, Form_f):
        Form_f.setWindowTitle(QCoreApplication.translate("Form_f", u"Form", None))
        self.groupBox_f.setTitle("")
        self.label_id_f.setText("")
        self.deleteButton_f.setText("")

main.py:

import sys

from PySide6.QtWidgets import QApplication

from mainwindow import MainWindow
from base_ui.ui_form_f import Ui_Form_f

if __name__ == '__main__':
    app=QApplication()
    window=MainWindow()
    window.show()
    sys.exit(app.exec())

Ответы (1 шт):

Автор решения: S. Nick

Поменяйте импорты для PySide6
и некоторые другие отличия от PyQt5 (@Slot() - @pyqtSlot(); Signal - pyqtSignal )

А также смотрите мои изменения по тексту.

q1439225_main.py

import sys
#from PySide6.QtWidgets import QApplication                  # PySide6
from PyQt5.Qt import *                                       # PyQt5

from q1439225_mainwindow import MainWindow
# ???from q1439225_ui_form_f import Ui_Form_f


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())   

q1439225_mainwindow.py

from PyQt5.Qt import *                                          # PyQt5

#from form_f import Form_f
from q1439225_form_f import Form_f

#from ui_mainwindow import Ui_MainWindow
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(400, 400)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.gridLayout = QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName(u"gridLayout")
        self.layout = QVBoxLayout()
        self.layout.setObjectName(u"layout")

        self.gridLayout.addLayout(self.layout, 0, 0, 1, 1)

        self.add_but = QPushButton(self.centralwidget)
        self.add_but.setObjectName(u"add_but")

        self.gridLayout.addWidget(self.add_but, 1, 0, 1, 1)

        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
        self.add_but.setText(QCoreApplication.translate("MainWindow", u"PushButton", None))
        

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__ (self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        
        self.id_f = 0                                        # 0
        
# ???        self.add_but_f.clicked.connect(self.addf)
        self.add_but.clicked.connect(self.addf)
   

#    @Slot()    # Добавление виджета ф                       # PySide6
    @pyqtSlot()                                              # PyQt5    
    def addf (self):
#-        self.id_f = 0
        form_f = Form_f(self.id_f)
        
# ???        self.layout_f.addWidget(form_f)
        self.layout.addWidget(form_f)
        
#        form_f.delete_f.connect(self.delete_form_f)
        form_f.delete_f.connect(
            lambda ch, form=form_f, id_f=self.id_f:              # +++
                   self.delete_form_f(form, id_f))               # +++       
        
        self.id_f += 1                                           # +++

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv 
#    @Slot(int) #Функция удаления виджета Ф
#    def delete_form_f(self, wid: int):
    def delete_form_f(self, form, wid: int):                     # +++
        print(f'Виджет удален ({wid})f')
        
        self.layout.removeWidget(form)
        form.deleteLater()
        
        self.id_f -= 1                                           # !!!

        countLayout = self.layout.count()                        # !!!
        for it in range(countLayout):                            # !!!        
            w = self.layout.itemAt(it).widget()                  # !!!
            w.label_id_f.setText(str(it))                        # !!!
            
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

q1439225_form_f.py

from PyQt5.Qt import *                                       # PyQt5

#from base_ui.ui_form_f import Ui_Form_f
class Ui_Form_f(object):
    def setupUi(self, Form_f):
        if not Form_f.objectName():
            Form_f.setObjectName(u"Form_f")
        Form_f.resize(375, 63)
        Form_f.setMinimumSize(QSize(375, 63))
        Form_f.setMaximumSize(QSize(400, 66))
        font = QFont()
        font.setFamilies([u"FreeSerif"])
        font.setPointSize(12)
        Form_f.setFont(font)
        self.verticalLayout_f = QVBoxLayout(Form_f)
        self.verticalLayout_f.setObjectName(u"verticalLayout_f")
        self.groupBox_f = QGroupBox(Form_f)
        self.groupBox_f.setObjectName(u"groupBox_f")
        self.horizontalLayout = QHBoxLayout(self.groupBox_f)
        self.horizontalLayout.setObjectName(u"horizontalLayout")
        self.label_id_f = QLabel(self.groupBox_f)
        self.label_id_f.setObjectName(u"label_id_f")
        self.label_id_f.setMinimumSize(QSize(135, 0))
        font1 = QFont()
        font1.setFamilies([u"FreeSerif"])
        font1.setPointSize(17)
        self.label_id_f.setFont(font1)
        self.label_id_f.setLayoutDirection(Qt.LeftToRight)
        self.label_id_f.setAlignment(Qt.AlignCenter)

        self.horizontalLayout.addWidget(self.label_id_f)
        self.horizontalSpacer_f = QSpacerItem(56, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout.addItem(self.horizontalSpacer_f)

        self.resultBox_f = QDoubleSpinBox(self.groupBox_f)
        self.resultBox_f.setObjectName(u"resultBox_f")
        self.resultBox_f.setMinimumSize(QSize(100, 0))

        self.horizontalLayout.addWidget(self.resultBox_f)

        self.deleteButton_f = QPushButton(self.groupBox_f)
        self.deleteButton_f.setObjectName(u"deleteButton_f")
        self.deleteButton_f.setMinimumSize(QSize(25, 25))
        icon = QIcon()

# установите свое       vvvvvvvvvvvv  
#        icon.addFile(u":/close.png", QSize(), QIcon.Normal, QIcon.Off)
        icon.addFile(u"img/close.png", QSize(), QIcon.Normal, QIcon.Off)
        
        
        self.deleteButton_f.setIcon(icon)
        self.horizontalLayout.addWidget(self.deleteButton_f)
        self.verticalLayout_f.addWidget(self.groupBox_f)
        self.retranslateUi(Form_f)
        QMetaObject.connectSlotsByName(Form_f)

    def retranslateUi(self, Form_f):
        Form_f.setWindowTitle(QCoreApplication.translate("Form_f", u"Form", None))
        self.groupBox_f.setTitle("")
        self.label_id_f.setText("")
        self.deleteButton_f.setText("")


# ----------------->  vvvvvvvvv <--------------------------- +++
class Form_f(QWidget, Ui_Form_f):
#    delete_f = Signal(int)                                  # PySide6
    delete_f = pyqtSignal(int)                               # PyQt5    
    
    def __init__(self, id_widget_f: int, parent=None):
        super(Form_f, self).__init__(parent)
#        self.ui = Ui_Form_f()
#        self.ui.setupUi(self)
        self.setupUi(self)                                   # !!!
        
        self.id_widget_f = id_widget_f      
        self.label_id_f.setText(str(id_widget_f))
        
        self.deleteButton_f.clicked.connect(self.press_del_f)
        
        
#    @Slot()                                                 # PySide6
    @pyqtSlot()                                              # PyQt5    
    def press_del_f(self):
        self.delete_f.emit(self.id_widget_f)

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка