Назначение номера виджету 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 шт):
Поменяйте импорты для 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)


