Размещение сетки в виджетах PyQt5 Python

Проблема заключается в следующем. У меня есть приложение на PyQt5. Использую сеточный макет для размещение элементов.

Прикрепил 2 виджета с кнопками на основную сетку. Есть функция setSpacing, которая устанавливает расстояние между виджетами, но мне для каждого виджета нужно использовать "свои" отступы (и размещать элементы так удобнее), поэтому внутри каждого виджета создал ещё по сетке.

С этого момента, при добавлении кнопок на сетку с помощью функции addWidget(nameButton, coords), кнопки не устанавливаются на заданные координаты и функция setSpacing для сеток внутри каждого из виджетов отказывается работать.

Необходимо сделать так, чтобы внутри каждой сетки нормально работали функции addWidget (элементы устанавливались на нужные координаты) и setSpacing (соблюдалось указанное расстояние между элементами).

Привожу схему:

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

Необходимо, чтобы:

  1. были соблюдены заданные мною отступы с помощью функции setSpacing и её производных (setVerticalSpacing и setHorizontalSpacing);
  2. кнопка занимала указанные координаты на сетке (row, column)

Как это выглядит у меня:

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

  1. функция setSpacing не даёт никакого результата (кнопки остаются на своих местах)
  2. указанные координаты для размещения кнопок не соблюдаются (кнопки просто накладываются на сетку)

Привожу код:

#!/usr/bin/python3
# -*- coding: utf-8 -*-


import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QGridLayout


class UiMainWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.centralgrid = QGridLayout()
        self.centralgrid.setContentsMargins(1, 1, 1, 1)

        self.right_widget()
        self.left_widget()

        self.main_frame_settings()

    # метод для создания левого виджета, а также для создания и размещения кнопок на нём
    def left_widget(self):
        self.buttongrid = QGridLayout()
        self.buttonswidget = QWidget(self)

        self.buttonswidget.setStyleSheet("background-color: rgb(120, 120, 120)")

        self.btn_weather = QPushButton("Weather")
        self.btn_birth = QPushButton("Birthdays")
        
        # кнопки устанавливаются не в указанные координаты (14, 0) и (15, 0) !!!
        self.buttongrid.addWidget(self.btn_weather, 14, 0, 1, 1)
        self.buttongrid.addWidget(self.btn_birth, 15, 0, 1, 1)
        
        # функция не работает !!!
        self.buttongrid.setSpacing(25)

        self.buttonswidget.setLayout(self.buttongrid)
        self.centralgrid.addWidget(self.buttonswidget, 0, 0, 38, 1)

    # метод для создания правого виджета, а также для создания и размещения кнопок на нём
    def right_widget(self):
        self.gridWidget = QGridLayout()
        self.centralwidget = QWidget(self)

        self.centralwidget.setStyleSheet("background-color: rgb(0, 160, 160)")

        # наложение сетки на основное окно
        self.setLayout(self.centralgrid)
        self.centralwidget.setLayout(self.gridWidget)

        self.btn5 = QPushButton("QQ")
        self.btn6 = QPushButton("123")

        self.centralgrid.addWidget(self.centralwidget, 0, 1, 38, 5)
        # кнопки устанавливаются не в указанные координаты (0, 0) и (4, 0) !!!
        self.gridWidget.addWidget(self.btn5, 0, 0, 1, 1)
        self.gridWidget.addWidget(self.btn6, 4, 0, 1, 1)

    def main_frame_settings(self):
        self.setWindowTitle("Lapa")
        self.resize(500, 500)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = UiMainWindow()
    window.show()
    sys.exit(app.exec_())

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

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

Я не совсем понял как вы хотите разместить кнопки внутри левого и правого виджета. Предложу вам поиграться с моим примером.

Обратите внимание, я размещаю в centralgrid виджеты leftWidget и rightWidget, а не Layoutы.

Рекомендую вам прочитать https://doc.qt.io/qt-5/qgridlayout.html , особое внимание обратите на setColumnStretch, setRowStretch и setSpacing.

Все работает как надо. Удачи вам.

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QGridLayout
from PyQt5.Qt import *


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.centralgrid = QGridLayout(self)                                 # +++ self
        self.centralgrid.setContentsMargins(1, 1, 1, 1)

        self.left_widget()
        self.centralgrid.addWidget(self.leftWidget, 0, 0)   #, 38, 1)
        self.centralgrid.setColumnStretch(0, 2)                              # !!!  2
        
        self.right_widget()
        self.centralgrid.addWidget(self.rightWidget, 0, 1)  #, 38, 1)
        self.centralgrid.setColumnStretch(1, 9)                              # !!!  9

        self.main_frame_settings()

    # метод для создания левого виджета, а также для создания и размещения кнопок на нём
    def left_widget(self):
        self.leftWidget = QWidget()                                               # leftWidget
        self.leftWidget.setStyleSheet("background-color: rgb(120, 120, 120)") 
        self.leftGrid = QGridLayout(self.leftWidget)

        self.btn_weather = QPushButton("Weather")
        self.btn_birth = QPushButton("Birthdays")

        ''' или так
        spacer = QSpacerItem(25, 25, QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.leftGrid.addItem(spacer, 0, 0)
        # кнопки устанавливается не в указанные координаты (14, 0) и (15, 0) !!!
        self.leftGrid.addWidget(self.btn_weather, 14, 0, 1, 1)
        self.leftGrid.addWidget(self.btn_birth, 15, 0, 1, 1)
        self.leftGrid.addItem(spacer, 38, 0)  
        '''
        self.leftGrid.addWidget(self.btn_weather, 14, 1, 1, 1)
        self.leftGrid.addWidget(self.btn_birth,   15, 1, 1, 1)
        
        self.leftGrid.setColumnStretch(0, 1)                        # !!!
        self.leftGrid.setColumnStretch(2, 1)                        # !!!
        self.leftGrid.setRowStretch(0, 1)                           # !!!
        self.leftGrid.setRowStretch(38, 1)                          # !!!
        
        # функция работает !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        self.leftGrid.setSpacing(25)

    # метод для создания правого виджета,
    def right_widget(self):
        self.rightWidget = QWidget()
        self.rightWidget.setStyleSheet("background-color: rgb(0, 160, 160)")

        self.btn5 = QPushButton("QQ")
        self.btn6 = QPushButton("123")
        
        self.rightGrid = QGridLayout(self.rightWidget)
        # кнопки устанавливается не в указанные координаты (0, 0) и (4, 0) !!!
        self.rightGrid.addWidget(self.btn5, 1, 1, 1, 1)
        self.rightGrid.addWidget(self.btn6, 4, 1, 1, 1)

#        self.rightGrid.setColumnStretch(0, 1)                        # !!!
#        self.rightGrid.setColumnStretch(2, 1)                        # !!!
        self.rightGrid.setRowStretch(0, 1)                            # !!!
        self.rightGrid.setRowStretch(38, 1)                           # !!!
        
        # функция работает !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        self.rightGrid.setSpacing(75)

    def main_frame_settings(self):
        self.setWindowTitle("Lapa")
        self.resize(640, 480)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
    

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

→ Ссылка