Динамически добавлять и удалять макет, когда выбран один из переключателей - PullRequest
0 голосов
/ 23 июня 2018

Я могу динамически добавлять макет в QHBoxLayout в pyqt, однако я не могу удалить их после добавления.

Основной целью является динамическое добавление и удаление макета на основе выбранной кнопки-переключателя.

def SearchTab(self):

  self.layout = QVBoxLayout()

  button_layout = QHBoxLayout()
  radio_button_1 = QRadioButton("Search")
  radio_button_2 = QRadioButton("Update")
  button_layout.addWidget(radio_button_1)
  button_layout.addWidget(radio_button_2)
  self.layout.addItem(button_layout)

  radio_button_1.toggled.connect(lambda :self.SelectButtonCheck(radio_button_1))
  radio_button_1.toggled.connect(lambda :self.UpdateButtonCheck(radio_button_2))

  self.setTabText(0,"Search")

  self.tab1.setLayout(self.layout)


def SelectButtonCheck(self,b):
    if b.text() == "Search":
        if b.isChecked():
            print(b.text()+ "is selected")
            self.pg_details = pgd.PGDetails()
            layout = self.pg_details.returnLayout()
            self.layout.addLayout(layout)


def UpdateButtonCheck(self,b):

    if b.text() == "Update":
        if b.isChecked():
            print(b.text()+ " is selected")
            for i in  range(self.layout.count()):
                print(self.layout.itemAt(i))
                temp_layout = self.layout.itemAt(i)
                widget = temp_layout.widget()
                temp_layout.removeItem(temp_layout)

                if widget is not None:
                    widget.deleteLater()

Начальный экран-

В настоящее время я могу добавить макет, когда выбран переключатель «Поиск» -

Contains QFromLayout

Но ничего не происходит, когда я выбираю "Обновить" RadioButton

Nothing Happens here and the application crashed

Также найдите макеты, которые были добавлены-

for i in  range(self.layout.count()):
print(self.layout.itemAt(i))
<PyQt5.QtWidgets.QHBoxLayout object at 0x1180ec438>
<PyQt5.QtWidgets.QFormLayout object at 0x1180ff828>

Макеты добавляются, но не удаляются.

Любые ссылки будут полезны, в том, что я здесь упускаю

1 Ответ

0 голосов
/ 24 июня 2018

Я смог решить это. Это заняло у меня некоторое время, но я понял, как устроены виджеты в макетах.

Я предполагал, что удаление макета приведет к каскадному удалению самих виджетов.

Я использовал приведенную ниже функцию для удаления макета и соответствующих ему виджетов.

def SearchTab(self):

      self.layout = QVBoxLayout()

      button_layout = QHBoxLayout()
      radio_button_1 = QRadioButton("Search")
      radio_button_2 = QRadioButton("Update")
      button_layout.addWidget(radio_button_1)
      button_layout.addWidget(radio_button_2)
      self.layout.addItem(button_layout)
      #createDB()
      radio_button_1.toggled.connect(lambda :self.SelectButtonCheck(radio_button_1,self.layout))
      radio_button_1.toggled.connect(lambda :self.UpdateButtonCheck(radio_button_2,self.layout))
      #layout.addRow("Address",QLineEdit())
      self.setTabText(0,"Search")

      update_layout = QHBoxLayout()
      #update_layout.set
      #update_btn = QDialogButtonBox(QDialogButtonBox)
      #update_btn.setAlignment(Qt.AlignBottom)
      update_layout.setAlignment(QtCore.Qt.AlignTop)
      update_btn = QPushButton('Update')
      reset_btn = QPushButton('Reset')
      #self.layout.addRow(update_layout)
      update_layout.addWidget(update_btn)
      update_layout.addWidget(reset_btn)

      update_btn.clicked.connect(self.createDB)

      self.tab1.setLayout(self.layout)

    def SelectButtonCheck(self,b,stacklayout):
        if b.text() == "Search":
            if b.isChecked():
                print(b.text()+ "is selected")
                self.pg_details = pgd.PGDetails()
                layout = self.pg_details.returnLayout()
                self.layout.addLayout(layout)

    def removeLayout(self,layout):
            for i in  range(layout.count()):
                temp_layout = layout.itemAt(i)
                if temp_layout is not None:
                    widget = temp_layout.widget()
                    if widget is not None:
                        widget.deleteLater()
                else:
                    return
                if temp_layout.layout() is not None:
                    self.removeLayout(temp_layout.layout())


    def removeFormLayout(self,layout):

        if layout is not None:

            for i in  range(layout.count()):
                    temp_layout = layout.itemAt(i)
                    if isinstance(temp_layout.layout(),type(QFormLayout())):
                            self.removeLayout(temp_layout.layout())

                    else:
                        next
        else:
            return


    def UpdateButtonCheck(self,b,stacklayout):

        if b.text() == "Update":
            if b.isChecked():
                print(b.text()+ " is selected")
                self.removeFormLayout(stacklayout)

Функция removeFormLayout выбирает форму-форму, добавленную мной с помощью радиокнопки Search, а removeLayout также удаляет все виджеты под ней.

enter image description here

Открыт для предложений и улучшений в используемом методе, я попробовал его с парой удалений макетов, кроме FormLayout. В настоящее время работает нормально.

Также кто-нибудь знает, как выровнять HBoxLayout сверху, радио-кнопка снова начинается с середины, я хочу выровнять их в верхней части экрана

...