Jak nastavit název objektu při přidávání dynamicky?

0

Otázka

Já jsem vytvořit kalkulačku kalorií a musím přidat potraviny dynamicky. Já jsem přidávání widgetů dynamicky. Já, například, přidat štítek. Ale po setObjectName jsem nemůže získat přístup tím, že jméno. Například jsem nastavit jméno pro label "název". Já jsem se snaží dostat text štítku podle jména s tímto názvem obrazu.text (), ale kód je shazovat. Co dělám špatně?

Zde je kód:

import sys  # interaction with Python

from PyQt5.QtWidgets import *  # for classic application based on widgets
from PyQt5 import uic  # to read ui file
from PyQt5 import QtWidgets  # to create gui


class MyWin(QtWidgets.QMainWindow):  # create class witch inherit QMainWindow
    def __init__(self):  # constructor
        QtWidgets.QMainWindow.__init__(self)  # constructor of parent class
        uic.loadUi("gui.ui", self)  # load ui

        self.add_product.clicked.connect(self.add)
        self.remove_product.clicked.connect(self.remove)

    def add(self):
        h1 = QHBoxLayout()
        self.label = QLabel()
        self.label.setObjectName("name")  # set name
        self.label.text = "L"
        h1.addWidget(self.label)
        h1.addWidget(QLabel('Weight'))
        h2 = QHBoxLayout()
        h2.addWidget(QLineEdit())
        h2.addWidget(QLineEdit())
        i = self.verticalLayout_2.count()
        self.verticalLayout_2.insertLayout(i - 2, h1)
        self.verticalLayout_2.insertLayout(i - 1, h2)
        print(self.name.text())  # ERROR
    def remove(self):
        i = self.verticalLayout_2.count()
        if i > 3:
            QWidget().setLayout(self.verticalLayout_2.takeAt(i - 3))
            QWidget().setLayout(self.verticalLayout_2.takeAt(i - 4))


if __name__ == '__main__':  # for check non import module
    app = QApplication(sys.argv)  # create app
    mw = MyWin()  # create object of MyWin class
    mw.show()  # to show gui
    sys.exit(app.exec_())  # execute app

ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>458</width>
    <height>234</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <widget class="QGroupBox" name="breakfest">
      <property name="title">
       <string>Breakfest</string>
      </property>
      <layout class="QVBoxLayout" name="verticalLayout_3">
       <item>
        <layout class="QVBoxLayout" name="verticalLayout_2">
         <item>
          <layout class="QHBoxLayout" name="horizontalLayout_2">
           <item>
            <widget class="QLabel" name="label_product">
             <property name="text">
              <string>Product</string>
             </property>
            </widget>
           </item>
           <item>
            <widget class="QLabel" name="label_weight">
             <property name="text">
              <string>Weight</string>
             </property>
            </widget>
           </item>
          </layout>
         </item>
         <item>
          <layout class="QHBoxLayout" name="horizontalLayout">
           <item>
            <widget class="QLineEdit" name="lineEdit_product"/>
           </item>
           <item>
            <widget class="QLineEdit" name="lineEdit_weight"/>
           </item>
          </layout>
         </item>
         <item>
          <spacer name="verticalSpacer">
           <property name="orientation">
            <enum>Qt::Vertical</enum>
           </property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>20</width>
             <height>40</height>
            </size>
           </property>
          </spacer>
         </item>
         <item>
          <layout class="QHBoxLayout" name="horizontalLayout_3">
           <item>
            <widget class="QPushButton" name="add_product">
             <property name="text">
              <string>Add product</string>
             </property>
            </widget>
           </item>
           <item>
            <widget class="QPushButton" name="remove_product">
             <property name="text">
              <string>Remove product</string>
             </property>
            </widget>
           </item>
          </layout>
         </item>
        </layout>
       </item>
      </layout>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>
pyqt pyqt5 python user-interface
2021-11-20 13:20:23
1

Nejlepší odpověď

0

Nelze jednoduše přístup k objektu s objectName. Budete muset použít findChild metoda.

MOŽNOST 1:

self.widget_i_want = self.findChild(QLabel, "name")

Ale jako @ekhumoro řekl, to je nejlepší, pokud používáte seznam nebo dict ukládat všechny přidané štítky.

MOŽNOST 2:

class MyWin(QtWidgets.QMainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        uic.loadUi("gui.ui", self)  # load ui
        
        self.counter = 1  #this is going to be used to set unique names
        self.add_product.clicked.connect(self.add)
        self.remove_product.clicked.connect(self.remove)
        
        self.dynamically_added_widgets = list() 

    def add(self):
        global counter
        self.counter += 1
        h1 = QHBoxLayout()
        self.label = QLabel()
        self.label.setObjectName(f"name{self.counter}")  # set a new, unique name
        self.label.text = "L"
        h1.addWidget(self.label)
        h1.addWidget(QLabel('Weight'))
        h2 = QHBoxLayout()
        h2.addWidget(QLineEdit())
        h2.addWidget(QLineEdit())
        i = self.verticalLayout_2.count()
        self.verticalLayout_2.insertLayout(i - 2, h1)
        self.verticalLayout_2.insertLayout(i - 1, h2)

        self.dynamically_added_widgets.append(self.label) # add the new label to list
        print(self.dynamically_added_widgets)
        print(self.dynamically_added_widgets[-1].objectName())  # print the last added label's objectName
    def remove(self):
        i = self.verticalLayout_2.count()
        if i > 3:
            QWidget().setLayout(self.verticalLayout_2.takeAt(i - 3))
            QWidget().setLayout(self.verticalLayout_2.takeAt(i - 4))
2021-11-20 16:49:27

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................