У меня проблемы с 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