Как разместить виджеты на QGridLayout?
Возможно ли реализовать расположение виджетов как на изображении
с помощью QGridLayout и QVBoxLayout или их комбинации?

При этом, три дочерних виджета центрируются в зависимости от высоты родительского виджета (высоту виджета обозначает серый фон)
А размеры дочерних виджетов необходимо сохранить без изменений
(чтобы были такие же как у салатовых квадратов)
Пример моего кода:
class SideBar(QWidget):
def __init__(self, parent):
super().__init__(parent)
_width = 60
self.setGeometry(QRect(0, 0, _width, parent.height()))
self.layout = QGridLayout(self)
self.help = ClickedQLabel()
self.help.setPixmap(QPixmap('images/terminal.png'))
self.help.setToolTip('История1')
self.help.setStyleSheet('background-color: red;')
self.p = ClickedQLabel()
self.p.setPixmap(QPixmap('images/terminal.png'))
self.p.setToolTip('История2')
self.p.setStyleSheet('background-color: red;')
self.p_2 = ClickedQLabel()
self.p_2.setPixmap(QPixmap('images/terminal.png'))
self.p_2.setToolTip('История3')
self.p_2.setStyleSheet('background-color: red;')
self.p_3 = ClickedQLabel()
self.p_3.setPixmap(QPixmap('images/terminal.png'))
self.p_3.setToolTip('История4')
self.p_3.setStyleSheet('background-color: red;')
self.p_4 = ClickedQLabel()
self.p_4.setPixmap(QPixmap('images/terminal.png'))
self.p_4.setToolTip('История5')
self.p_4.setStyleSheet('background-color: red;')
self.Vlayout1 = QVBoxLayout()
self.Vlayout1.addWidget(self.help)
self.Vlayout2 = QVBoxLayout()
self.Vlayout2.addWidget(self.p)
self.Vlayout2.addWidget(self.p_2)
self.Vlayout2.addWidget(self.p_3)
self.Vlayout2.addWidget(self.p_4)
self.Vlayout3 = QVBoxLayout()
self.Vlayout3.addWidget(QWidget())
self.layout.addLayout(self.Vlayout1, 0, 0)
self.layout.addLayout(self.Vlayout2, 1, 0)
self.layout.addLayout(self.Vlayout3, 2, 0)
def paintEvent(self, event):
painter = QPainter(self)
painter.setBrush(QBrush(QColor('#202020')))
painter.setPen(Qt.NoPen)
barRect = QRect(0, 0, self.width(), self.height())
painter.drawRect(barRect)
painter.end()
Результат:
Заранее благодарю за помощь!
Ответы (2 шт):
Автор решения: S. Nick
→ Ссылка
То что вы предоставили не является минимально-воспроизводимым примером.
Я понял ваши задачу так:
import sys
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.Qt import *
class ClickedQLabel(QtWidgets.QLabel):
clicked = QtCore.pyqtSignal()
def __init__(self, parent=None):
super(ClickedQLabel, self).__init__(parent)
self.resize(100, 100)
self.setText("Hello World")
pixmap = QtGui.QPixmap('_+_.png').scaled(50, 50)
cursor = QtGui.QCursor(pixmap)
self.setCursor(cursor)
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
self.clicked.emit()
class SideBar(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
_width = 60
self.setGeometry(QRect(0, 0, _width, parent.height()))
self.layout = QGridLayout(self)
'''
self.help = ClickedQLabel()
self.help.setPixmap(QPixmap('images/android.png').scaled(60, 60))
self.help.setToolTip('История1')
self.help.setStyleSheet('background-color: #ce1212;')
'''
self.p = ClickedQLabel()
self.p.setPixmap(QPixmap('images/cartoon1.ico').scaled(60, 60))
self.p.setToolTip('История2')
self.p.setStyleSheet('background-color: #f54748;')
self.p_2 = ClickedQLabel()
self.p_2.setPixmap(QPixmap('images/cat.png').scaled(60, 60))
self.p_2.setToolTip('История3')
self.p_2.setStyleSheet('background-color: #f54748;')
self.p_3 = ClickedQLabel()
self.p_3.setPixmap(QPixmap('images/head2.jpg').scaled(60, 60))
self.p_3.setToolTip('История4')
self.p_3.setStyleSheet('background-color: #f54748;')
self.p_4 = ClickedQLabel()
self.p_4.setPixmap(QPixmap('images/f3.ico').scaled(60, 60))
self.p_4.setToolTip('История5')
self.p_4.setStyleSheet('background-color: #f54748;')
# self.Vlayout1 = QVBoxLayout()
# self.Vlayout1.addWidget(self.help)
self.Vlayout2 = QVBoxLayout()
self.Vlayout2.addWidget(self.p)
self.Vlayout2.addWidget(self.p_2)
self.Vlayout2.addWidget(self.p_3)
self.Vlayout2.addWidget(self.p_4)
self.Vlayout3 = QVBoxLayout()
self.Vlayout3.addWidget(QWidget())
# self.layout.addLayout(self.Vlayout1, 0, 0)
self.layout.addLayout(self.Vlayout2, 1, 0)
self.layout.addLayout(self.Vlayout3, 2, 0)
def paintEvent(self, event):
painter = QPainter(self)
painter.setBrush(QBrush(QColor('#2020ff')))
painter.setPen(Qt.NoPen)
barRect = QRect(0, 0, self.width(), self.height())
painter.drawRect(barRect)
painter.end()
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setMinimumSize(QtCore.QSize(200, 450))
self.setStyleSheet("background-color: rgb(45, 45, 45);")
self.centralwidget = QtWidgets.QWidget()
self.setCentralWidget(self.centralwidget)
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setSpacing(0)
self.Content = QtWidgets.QFrame(self.centralwidget)
self.Content.setStyleSheet("background-color: rgb(35, 235, 35);")
self.Content.setFrameShape(QtWidgets.QFrame.NoFrame)
self.Content.setFrameShadow(QtWidgets.QFrame.Raised)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.Content)
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_2.setSpacing(0)
self.verticalLayout.addWidget(self.Content)
self.frame_left_menu = QtWidgets.QFrame(self.Content)
self.frame_left_menu.setMinimumSize(QtCore.QSize(80, 0))
self.frame_left_menu.setMaximumSize(QtCore.QSize(80, 16777215))
self.frame_left_menu.setStyleSheet("background-color: rgb(35, 35, 35);")
self.frame_left_menu.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_left_menu.setFrameShadow(QtWidgets.QFrame.Raised)
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.frame_left_menu)
self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_2.addWidget(self.frame_left_menu)
self.frame_top_menus = QtWidgets.QFrame(self.frame_left_menu)
self.frame_top_menus.setFrameShape(QtWidgets.QFrame.NoFrame)
self.frame_top_menus.setFrameShadow(QtWidgets.QFrame.Raised)
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.frame_top_menus)
self.verticalLayout_4.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_4.setSpacing(0)
self.verticalLayout_3.addWidget(self.frame_top_menus, 0, QtCore.Qt.AlignCenter)
self.sideBar = SideBar(self.frame_top_menus)
self.verticalLayout_4.addWidget(self.sideBar)
self.help = ClickedQLabel(self.frame_left_menu)
self.help.setPixmap(QPixmap('images/android.png').scaled(60, 60))
self.help.setToolTip('История1')
self.help.setStyleSheet('background-color: #ce1212;')
self.help.setFixedSize(60, 60)
self.help.move(10, 10)
self.help.clicked.connect(lambda: print('Hello World'))
self.frame_pages = QtWidgets.QFrame(self.Content)
self.frame_pages.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_pages.setFrameShadow(QtWidgets.QFrame.Raised)
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.frame_pages)
self.horizontalLayout_2.addWidget(self.frame_pages)
self.myLabel = QLabel('Hello World')
font = QtGui.QFont()
font.setPointSize(40)
self.myLabel.setFont(font)
self.myLabel.setStyleSheet("color: #FFF;")
self.myLabel.setAlignment(QtCore.Qt.AlignCenter)
self.verticalLayout_5.addWidget(self.myLabel)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(800, 500)
w.show()
sys.exit(app.exec_())
Автор решения: Lo_okiMan
→ Ссылка
Вот что у меня получилось:
Вот код:
import sys
import os
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QGridLayout, QLabel
from PyQt5.QtCore import Qt, QRect
from PyQt5.QtGui import QColor, QBrush, QPainter, QPixmap
class SideBar(QWidget):
""" """
_width = 70
def __init__(self, parent=None):
super().__init__(parent)
# self.setMaximumSize(self._width, 100000)
self.layout = QGridLayout(self)
self.help_button = QLabel(self)
self.help_button.setPixmap(QPixmap('images'+os.sep+'help.png'))
self.help_button.setToolTip('История1')
self.help_button.setFixedSize(32, 32)
self.command_button = QLabel()
self.command_button.setPixmap(QPixmap('images'+os.sep+'terminal.png'))
self.command_button.setFixedSize(32, 32)
self.command_button.setToolTip('История2')
self.history_button = QLabel()
self.history_button.setPixmap(QPixmap('images'+os.sep+'history.png'))
self.history_button.setFixedSize(32, 32)
self.history_button.setToolTip('История3')
self.folder_button = QLabel()
self.folder_button.setPixmap(QPixmap('images'+os.sep+'folder.png'))
self.folder_button.setFixedSize(32, 32)
self.folder_button.setToolTip('История4')
self.settings_button = QLabel()
self.settings_button.setPixmap(QPixmap('images'+os.sep+'settings.png'))
self.settings_button.setFixedSize(32, 32)
self.settings_button.setToolTip('История5')
self.top_menu = QWidget()
self.top_menu.setContentsMargins(0, 0, 0, 0)
self.top_menu.setStyleSheet('background-color: blue;')
self.topMenuGridLayout = QGridLayout(self.top_menu)
self.topMenuGridLayout.setContentsMargins(0, 0, 0, 0)
self.topMenuGridLayout.addWidget(self.help_button)
self.center_menu = QWidget()
# Задаем максимальную высоту для центрального блока
self.center_menu.setMaximumHeight(300)
self.center_menu.setContentsMargins(0, 0, 0, 0)
self.center_menu.setStyleSheet('background-color: red;')
self.centerMenuGridLayout = QGridLayout(self.center_menu)
self.centerMenuGridLayout.setContentsMargins(0, 0, 0, 0)
self.centerMenuGridLayout.setSpacing(30)
self.centerMenuGridLayout.addWidget(self.history_button, 0, 0)
self.centerMenuGridLayout.addWidget(self.command_button, 1, 0)
self.centerMenuGridLayout.addWidget(self.folder_button, 3, 0)
self.centerMenuGridLayout.addWidget(self.settings_button, 4, 0)
#
self.layout.addWidget(self.top_menu, 1, 0, Qt.AlignTop)
self.layout.addWidget(self.center_menu, 2, 0)
self.layout.addWidget(QWidget())
def paintEvent(self, event):
""" """
painter = QPainter(self)
painter.setBrush(QBrush(QColor('#202020')))
painter.setPen(Qt.NoPen)
barRect = QRect(0, 0, self.width(), self.height())
painter.drawRect(barRect)
painter.end()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.side_bar = SideBar(self)
self.side_bar.setGeometry(0, 0, 70, 800)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.resize(800, 800)
window.show()
sys.exit(app.exec_())


