Не правильно размещается объект QLineEdit в менеджере компоновки

В layout на PyQt5 не размещается объект QLineEdit.
LineEdit просто отрисовывается поверх кнопок.

main.py:

from sys import argv, exit
from string import ascii_uppercase
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton, QVBoxLayout, QSizePolicy, QLineEdit

MORSE = {'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.', 'G': '--.',
         'H': '....', 'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..', 'M': '--', 'N': '-.',
         'O': '---', 'P': '.--.', 'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-', 'U': '..-',
         'V': '...-', 'W': '.--', 'X': '-..-', 'Y': '-.--', 'Z': '--..'}
POSITION = [(i, j) for i in range(2) for j in range(13)]


class ABCMorse(QWidget):
    def __init__(self):
        super(ABCMorse, self).__init__()

        self.grid_layout = QGridLayout(self)
        self.vertical_layout = QVBoxLayout(self)

        for position, letter in zip(POSITION, list(ascii_uppercase)): # тут через цикл расставляю кнопки
            button = QPushButton(letter)
            button.setObjectName('push_button' + letter)
            button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
            self.grid_layout.addWidget(button, *position)

        self.line_edit = QLineEdit(self)
        self.line_edit.setEnabled(False)
        self.line_edit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

        self.vertical_layout.addLayout(self.grid_layout)
        self.vertical_layout.addWidget(self.line_edit)

        self.setLayout(self.vertical_layout)


if __name__ == '__main__':
    app = QApplication(argv)
    wnd = ABCMorse()
    wnd.show()
    exit(app.exec())

Ответы (1 шт):

Автор решения: S. Nick

Смотрим ошибки:

QLayout: Attempting to add QLayout "" to ABCMorse "", which already has a layout
QLayout::addChildLayout: layout "" already has a parent
QWidget::setLayout: Attempting to set QLayout "" on ABCMorse "", which already has a layout

from sys import argv, exit
from string import ascii_uppercase
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, \
    QPushButton, QVBoxLayout, QSizePolicy, QLineEdit


MORSE = {'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 
         'F': '..-.', 'G': '--.',
         'H': '....', 'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..', 
         'M': '--', 'N': '-.',
         'O': '---', 'P': '.--.', 'Q': '--.-', 'R': '.-.', 'S': '...', 
         'T': '-', 'U': '..-',
         'V': '...-', 'W': '.--', 'X': '-..-', 'Y': '-.--', 'Z': '--..'}
         
POSITION = [(i, j) for i in range(2) for j in range(13)]


class ABCMorse(QWidget):
    def __init__(self):
        super(ABCMorse, self).__init__()

# ------------------------------------> vvvv <-------------------------???
#        self.grid_layout = QGridLayout(self) 
        self.grid_layout = QGridLayout()                                 # !!! +
        
        self.vertical_layout = QVBoxLayout(self)

        # тут через цикл расставляю кнопки
        for position, letter in zip(POSITION, list(ascii_uppercase)): 
            button = QPushButton(letter)
            button.setObjectName('push_button' + letter)
            button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
            self.grid_layout.addWidget(button, *position)
            
            button.clicked.connect(lambda ch, lt=letter: self.button_clicked(lt))

        self.line_edit = QLineEdit(self)
        self.line_edit.setEnabled(False)
        self.line_edit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

        self.vertical_layout.addLayout(self.grid_layout)
        self.vertical_layout.addWidget(self.line_edit)

#        self.setLayout(self.vertical_layout)
        
    def button_clicked(self, letter):
        self.line_edit.setText(f'{self.line_edit.text()}{letter}')
    

if __name__ == '__main__':
    app = QApplication(argv)
    wnd = ABCMorse()
    wnd.show()
    exit(app.exec())

введите сюда описание изображения

→ Ссылка