Не правильно размещается объект 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())
