Элементы форм отображаются не правильно в PyQt5
Имеется программа с несколькими кнопками, в которой добавляются пользовательские формы (то-есть, они написаны не автором PyQt5, а переделаны), а именно формы квадратной формы, совмещающие в себе кликабельность и возможность смены текста внутри.
Так вот, при добавлении их к главному QGridLayout программы происходит перемешивание этих квадратных форм и кнопок. Не могу понять проблему, помогите, пожалуйста.
Код:
import sys
import random
from PyQt5.QtCore import pyqtSignal, Qt
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, \
QGridLayout, QPushButton, QLabel, QHBoxLayout, QVBoxLayout, \
QLineEdit, QMessageBox, QFormLayout, QComboBox
from PyQt5.QtGui import QIcon, QPixmap, QFont, QColor
method_box_methods = ['Addition of all elements', 'Multiplication of all elements']
class Label(QLabel):
clicked = pyqtSignal()
doubleClicked = pyqtSignal()
def __init__(self, parent=None):
super(Label, self).__init__(parent)
self.resize(75, 75)
self.setText("Hello World")
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.clicked.emit()
def mouseDoubleClickEvent(self, event):
if event.button() == Qt.RightButton:
self.doubleClicked.emit()
class Widget(QWidget):
def __init__(self):
super().__init__()
self.setMinimumHeight(75)
self.label = Label(self)
self.label.setWordWrap(True)
self.color = QColor(255, 255, 255).name()
self.label.setStyleSheet(f"background-color: {self.color}")
self.label.clicked.connect(self.onClicked)
self.label.doubleClicked.connect(self.onDoubleClicked)
self.lineEdit = QLineEdit(self)
self.lineEdit.editingFinished.connect(self.editFinished)
self.lineEdit.setGeometry(self.label.geometry())
self.lineEdit.hide()
def onClicked(self):
if self.color == '#ffd700':
self.color = QColor(255, 255, 255).name()
else:
self.color = QColor(255, 215, 0).name()
self.label.setStyleSheet(f"background-color: {self.color}")
def onDoubleClicked(self):
self.lineEdit.setText(self.label.text())
self.lineEdit.setStyleSheet(f"background-color: {self.color}")
self.lineEdit.show()
self.lineEdit.setFocus()
def editFinished(self):
self.label.setText(self.lineEdit.text())
self.lineEdit.hide()
class FormBuilder(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.create_button_forms()
self.create_layouts()
def create_button_forms(self):
self.generate_button = QPushButton("Generate array")
self.generate_button.setFixedHeight(30)
self.clear_button = QPushButton("Clear array")
self.clear_button.setFixedHeight(30)
self.apply_button = QPushButton("Apply method")
self.apply_button.setFixedHeight(30)
self.method_box = QComboBox()
self.method_box.addItems(method_box_methods)
self.method_box.setFixedHeight(30)
def create_layouts(self):
layout = QVBoxLayout(self)
first_layer = QHBoxLayout()
first_layer.addWidget(self.generate_button)
first_layer.addWidget(self.clear_button)
first_layer.addWidget(self.apply_button)
second_layer = QHBoxLayout()
second_layer.addWidget(self.method_box)
layout.addLayout(first_layer)
layout.addLayout(second_layer)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
self.build_skeleton_with_basic_settings()
self.create_and_connect_grid()
self.create_array()
def build_skeleton_with_basic_settings(self):
self.setFixedSize(500, 550)
self.setWindowTitle('Plates')
self.setWindowIcon(QIcon('Images\\logo.jpg'))
self.setFont(QFont('Arial', 16)) # убрать строку/заменить шрифт после окончания проекта.
def create_and_connect_grid(self):
self.grid = QGridLayout(self.centralWidget)
self.formBuilder = FormBuilder()
self.grid.addWidget(self.formBuilder, 0, 0, Qt.AlignTop)
def create_array(self):
widget = Widget()
self.row, self.column = 0, 0
for i in range(5):
self.grid.addWidget(widget, self.row, self.column)
self.column += 1
widget = Widget()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainWindow()
ex.show()
sys.exit(app.exec_())
Фото получающейся краказябры с формами, здесь так же перестают работать кнопки и они немного сдвигаются:
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
я отметил для вас строки, в которые внес изменения.
import sys
import random
from PyQt5.QtCore import pyqtSignal, Qt
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, \
QGridLayout, QPushButton, QLabel, QHBoxLayout, QVBoxLayout, \
QLineEdit, QMessageBox, QFormLayout, QComboBox
from PyQt5.QtGui import QIcon, QPixmap, QFont, QColor
method_box_methods = ['Addition of all elements', 'Multiplication of all elements']
class Label(QLabel):
clicked = pyqtSignal()
doubleClicked = pyqtSignal()
def __init__(self, parent=None):
super(Label, self).__init__(parent)
self.resize(75, 75)
self.setText("Hello World")
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.clicked.emit()
def mouseDoubleClickEvent(self, event):
if event.button() == Qt.RightButton:
self.doubleClicked.emit()
class Widget(QWidget):
def __init__(self):
super().__init__()
self.setMinimumHeight(75)
self.setMinimumWidth(75) # +++
self.label = Label(self)
self.label.setWordWrap(True)
self.color = QColor(255, 255, 255).name()
self.label.setStyleSheet(f"background-color: {self.color}")
self.label.clicked.connect(self.onClicked)
self.label.doubleClicked.connect(self.onDoubleClicked)
self.lineEdit = QLineEdit(self)
self.lineEdit.editingFinished.connect(self.editFinished)
self.lineEdit.setGeometry(self.label.geometry())
self.lineEdit.hide()
def onClicked(self):
if self.color == '#ffd700':
self.color = QColor(255, 255, 255).name()
else:
self.color = QColor(255, 215, 0).name()
self.label.setStyleSheet(f"background-color: {self.color}")
def onDoubleClicked(self):
self.lineEdit.setText(self.label.text())
self.lineEdit.setStyleSheet(f"background-color: {self.color}")
self.lineEdit.show()
self.lineEdit.setFocus()
def editFinished(self):
self.label.setText(self.lineEdit.text())
self.lineEdit.hide()
class FormBuilder(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.create_button_forms()
self.create_layouts()
def create_button_forms(self):
self.generate_button = QPushButton("Generate array")
#? self.generate_button.setFixedHeight(30)
self.clear_button = QPushButton("Clear array")
#? self.clear_button.setFixedHeight(30)
self.apply_button = QPushButton("Apply method")
#? self.apply_button.setFixedHeight(30)
self.method_box = QComboBox()
self.method_box.addItems(method_box_methods)
#? self.method_box.setFixedHeight(30)
def create_layouts(self):
layout = QVBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0) # +++
first_layer = QHBoxLayout()
first_layer.addWidget(self.generate_button)
first_layer.addWidget(self.clear_button)
first_layer.addWidget(self.apply_button)
second_layer = QHBoxLayout()
second_layer.addWidget(self.method_box)
layout.addLayout(first_layer)
layout.addLayout(second_layer)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
self.build_skeleton_with_basic_settings()
self.create_and_connect_grid()
self.create_array()
def build_skeleton_with_basic_settings(self):
#? self.setFixedSize(500, 550)
self.resize(450, 550) # +++
self.setWindowTitle('Plates')
self.setWindowIcon(QIcon('Images\\logo.jpg'))
self.setFont(QFont('Arial', 16)) # убрать строку/заменить шрифт
def create_and_connect_grid(self):
self.grid = QGridLayout(self.centralWidget)
self.grid.setContentsMargins(20, 20, 20, 20) # +++
self.formBuilder = FormBuilder()
# self.grid.addWidget(self.formBuilder, 0, 0, Qt.AlignTop)
self.grid.addWidget(self.formBuilder, 0, 0, 1, 5, Qt.AlignTop) # +++
def create_array(self):
widget = Widget()
# self.row, self.column = 0, 0
self.row, self.column = 1, 0 # +++
for i in range(5):
self.grid.addWidget(widget, self.row, self.column)
self.column += 1
widget = Widget()
self.grid.setRowStretch(10, 1) # +++
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainWindow()
ex.show()
sys.exit(app.exec_())

