Почему QLabels перезаписываются, а не удаляются? - см. изображение

У меня проблемы с QGridLayout для моего пользовательского интерфейса. Здесь я пытаюсь создать пользовательский интерфейс, который реагирует на файл, который загружает пользователь. При первой загрузке 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

person ADB    schedule 29.04.2014    source источник
comment
Удалите старые виджеты (метки в вашем случае) перед добавлением новых, как предложил Себастейн.   -  person qurban    schedule 29.04.2014


Ответы (1)


Попробуйте удалить виджет перед его удалением:

myWidget = self.txGrid.itemAtPosition(i, 4).widget() 
self.txGrid.removeWidget(myWidget); 
myWidget.deleteLater()
person Sebastian Lange    schedule 29.04.2014
comment
Спасибо, отлично сработало! Не до конца понял последовательность сначала удаление, потом удаление. - person ADB; 29.04.2014
comment
2-я строка кода является необязательной, вы можете использовать ее, когда хотите удалить myWidget из этого макета сетки и добавить в какой-либо другой макет. вы можете удалить 2-ю строку. - person qurban; 29.04.2014
comment
Логично, хотя я бы сказал и это, но это не так, так как это был его пример с проблемами self.txGrid.itemAtPosition(i, 4).widget().deleteLater(). Макет, кажется, содержит ссылку на виджет. - person Sebastian Lange; 29.04.2014