Qt 为什么QLabel会被覆盖而不是删除?-见图片

Qt 为什么QLabel会被覆盖而不是删除?-见图片,qt,pyqt,qt5,pyqt5,Qt,Pyqt,Qt5,Pyqt5,我的UI的QGridLayout有问题。在这里,我试图创建响应用户加载的文件的UI。第一次加载时,QGridLayout会更新,反映文件的内容,一切正常。但是,下一次加载文件时,应该删除网格中的小部件(调用deleteLater()执行此操作)。正在发生的是,它们只是被覆盖了 图片可能会有所帮助-这是重复加载两个不同文件后看到的。您可以看到“传输消息”和“字段”文本 我使用的代码如下。如果有人觉得在代码的其他地方找不到错误,我可以发布更多。但这里似乎找到了令人不快的逻辑。特别是,在每次调用中创

我的UI的QGridLayout有问题。在这里,我试图创建响应用户加载的文件的UI。第一次加载时,QGridLayout会更新,反映文件的内容,一切正常。但是,下一次加载文件时,应该删除网格中的小部件(调用deleteLater()执行此操作)。正在发生的是,它们只是被覆盖了

图片可能会有所帮助-这是重复加载两个不同文件后看到的。您可以看到“传输消息”和“字段”文本

我使用的代码如下。如果有人觉得在代码的其他地方找不到错误,我可以发布更多。但这里似乎找到了令人不快的逻辑。特别是,在每次调用中创建新的QLabel是否有问题

def populateTxField(self):
    # First delete the old contents
    rowcount = self.txGrid.rowCount()
    for i in range(1, rowcount):
        try:
            # Note that these widgets are QLabel type
            self.txGrid.itemAtPosition(i, 4).widget().deleteLater()
            self.txGrid.itemAtPosition(i, 3).widget().deleteLater()
        except AttributeError:
            # If widget has already been deleted, ignore the error
            pass

    key = self.firstTxMessageInfo.currentText()
    self.txQLabel_LineContainer = []  # store QLineEdits here

    # Now add all of the widgets to the transmission QGridLayout
    row = 1   # counter for adding to txGrid row
    for field in self.dataBack.messages[key].fields.keys():
        newLabel = QtWidgets.QLabel()        # Creating a new widget here...
        newLabel.setText(field)              # Is this problematic?
        newLineEdit = QtWidgets.QLineEdit()

        # Append to the following list to access from txActivateHandler.
        self.txQLabel_LineContainer.append((newLabel, newLineEdit))

        # Now update the grid with the new widgets
        self.txGrid.addWidget(newLabel,    row, 3)
        self.txGrid.addWidget(newLineEdit, row, 4)
        row += 1

尝试在删除小部件之前删除它:

myWidget = self.txGrid.itemAtPosition(i, 4).widget() 
self.txGrid.removeWidget(myWidget); 
myWidget.deleteLater()

正如Sebastain建议的那样,在添加新部件之前删除旧部件(在您的情况下是标签),效果非常好!未完全理解先删除再删除的顺序。第二行代码是可选的,当您想从此网格布局中删除
myWidget
并想添加到其他布局时,可以使用它。您可以删除第二行。在逻辑上,虽然我也会这么说,但事实并非如此,因为这是他的示例,存在问题
self.txGrid.itemAtPosition(i,4).widget().deleteLater()
。布局似乎保留了对小部件的引用。