QT:如何在布局中动态添加和删除小部件?

Posted

技术标签:

【中文标题】QT:如何在布局中动态添加和删除小部件?【英文标题】:QT: How can I dynamically add and delete widgets in a layout? 【发布时间】:2016-12-08 19:00:05 【问题描述】:
def add_ranges(self):
    self.ranges_layout = QtGui.QHBoxLayout()                            # setup the ranges_layout, it will be a child of all_ranges_layout
    self.min_label = QtGui.QLabel(self.normalization)                   # setup the min label
    self.max_label = QtGui.QLabel(self.normalization)                   # setup the max label
    self.min_lineEdit = QtGui.QLineEdit(self.normalization)             # setup the min lineEdit
    self.max_lineEdit = QtGui.QLineEdit(self.normalization)             # setup the max lineEdit
    self.all_ranges_layout.addLayout(self.ranges_layout)                # make ranges_layout a child of all_ranges_layout
    self.ranges_layout.addWidget(self.min_label)                        # apply the min label to the widget
    self.ranges_layout.addWidget(self.min_lineEdit)                     # apply the min lineEdit to the widget
    self.ranges_layout.addWidget(self.max_label)                        # apply the max label
    self.ranges_layout.addWidget(self.max_lineEdit)                     # apply the max lineEdit
    self.min_label.setText(_translate("MainWindow", "Min", None))       # set the text of the min label
    self.max_label.setText(_translate("MainWindow", "Max", None))       # set the text of the max label

    self.min_lineEdits.append(self.min_lineEdit)                        # set up an array of lineEdits
    self.max_lineEdits.append(self.max_lineEdit)                        #

def del_ranges(self):
    self.ranges_layout.removeWidget(self.min_label)                     # remove the min label to the widget
    self.ranges_layout.removeWidget(self.min_lineEdit)                  # remove the min lineEdit to the widget
    self.ranges_layout.removeWidget(self.max_label)                     # remove the max label
    self.ranges_layout.removeWidget(self.max_lineEdit)                  # remove the max lineEdit
    del self.min_lineEdits[-1]                                          # delete last element in list
    del self.max_lineEdits[-1]                                          # delete last element in list

点击“添加范围”,出现两个新框供用户添加数据。

单击“删除范围”,除了按钮视觉上向上移动之外什么都没有发生。这告诉我该函数正在工作(有点)并且正在删除布局,但不是 lineEdits 和标签。

这是我正在设计的程序中的两个函数。我想通过按下按钮来添加和删除小部件。我尝试使用 deleteLater() 然而,这个函数也落入了同一个坑;实际上并未删除 lineEdits 和标签。是不是删除前没有断开连接的问题?

【问题讨论】:

添加了 pyqt 标签。如果有错误请修正(例如,您使用的是 pyside)。 【参考方案1】:

使用此方法。它将迭代地遍历布局并 deleteLater() 特定布局中的每个小部件。在这种情况下self.all_ranges_layout

def del_ranges(self):
    to_delete = self.all_ranges_layout.takeAt(self.all_ranges_layout.count() - 1)
    if to_delete is not None:
        while to_delete.count():
            item = to_delete.takeAt(0)
            widget = item.widget()
            if widget is not None:
                widget.deleteLater()
            else:
                pass

在 n-1 索引处获取布局项 如果有要删除的对象,继续 而计数不为 0 获取第 0 个索引处的布局项 在此位置获取小部件 如果此小部件中有对象 删除这个小部件

【讨论】:

以上是关于QT:如何在布局中动态添加和删除小部件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥添加到网格布局的动态按钮彼此之间有很大的距离?

如果未动态添加,如何正确删除Kivy中的小部件

PyQt5 - 动态添加小部件到布局

如何将小部件动态添加到网格?

通过 pyqt5 动态添加和删除小部件

将自定义组件小部件动态添加到 Android 中的布局中