Вот код
from PySide6.QtWidgets import *
from PySide6.QtGui import *
from PySide6.QtCore import *
import sys
class Color(QWidget):
def __init__(self, color):
super(Color, self).__init__()
self.setAutoFillBackground(True)
palette = self.palette()
palette.setColor(QPalette.Window, QColor(color))
self.setPalette(palette)
class UrlImage(QLabel):
ImagesLoaded = {}
def __init__(self, url : str, *args, **kwargs):
super().__init__(*args, **kwargs)
self.image = QImage()
if not self.ImagesLoaded.get(url):
import requests
content = requests.get(url).content
self.image.loadFromData(content)
self.ImagesLoaded[url] = content
else:
self.image.loadFromData(self.ImagesLoaded[url])
self.pixmap = QPixmap.fromImage(self.image)
self.setPixmap( self.pixmap )
def resizeEvent(self, event):
print(event)
self.setPixmap(self.pixmap.scaled(event.size().width(), event.size().height()))
class UserAvatar(QWidget):
def __init__(self, contact, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setFixedSize(200, 40)
class ПрокручиваемыйВертикальноКонтент(QScrollArea):
def __init__(self, *args, **kwargs):
QScrollArea.__init__(self, *args, **kwargs)
layout = QVBoxLayout()
layout.setContentsMargins(0,0,0,0)
layout.setSpacing(0)
self._layout = layout
def addWidget(self, widget : QWidget):
self._layout.addWidget(widget)
self._layout.addStretch()
w = QWidget()
w.setLayout(self._layout)
self.setWidget(w)
class ПрокручиваемоеМенюКонтента(QWidget):
def __init__(self, *args, **kwargs):
QWidget.__init__(self, *args, **kwargs)
self.левоеМеню = ПрокручиваемыйВертикальноКонтент(parent=self)
self.иконкаРаскрытияМеню = UrlImage("https://static.thenounproject.com/png/2393596-200.png", parent=self.левоеМеню)
self.иконкаРаскрытияМеню.setGeometry(0,0, 40, 40)
self.левоеМеню.addWidget(self.иконкаРаскрытияМеню)
self.контентЗона = QWidget(self)
#self.контентЗона.setStyleSheet("background-color: rgba(255,255,255,55)")
self.идентификацияПанелей = {}
self.левоеМеню.resize(50, self.height())
self.левоеМеню.resizeEvent = lambda event: self.resizeEvent(event)
def OnMouseReleaseEvent(event):
if not hasattr(self, "panelToggleOpen") or self.panelToggleOpen is None:
self.panelToggleOpen = True
else:
self.panelToggleOpen = None
self.anim = QPropertyAnimation(self.левоеМеню, b"size")
self.anim.setEasingCurve(QEasingCurve.OutBounce)
self.anim.setEndValue(self.panelToggleOpen and QSize(210, self.height()) or QSize(40, self.height()))
self.anim.setDuration(1000)
self.anim.start()
self.иконкаРаскрытияМеню.mouseReleaseEvent=OnMouseReleaseEvent
def resizeEvent(self, event):
self.левоеМеню.setGeometry(0,0, self.левоеМеню.width(), self.height())
self.контентЗона.setGeometry(self.левоеМеню.width(), 0, self.width() - self.левоеМеню.width(), self.height())
for k, v in self.идентификацияПанелей.items():
v.контентПанель.resize(self.контентЗона.width(), self.контентЗона.height())
def указатьПанельОтображения(self, id : str):
pass
def добавитьЭлементВМеню(self, id : str, text : str, iconUrl : str):
widget = QWidget()
widget.setFixedHeight(50)
widget.setFixedWidth(200)
widget.setStyleSheet(":hover{background:#000000}")
widget._id = id
def mouseReleaseEvent(event):
self.приНажатииНаЭлемент(widget, id)
widget.mouseReleaseEvent = mouseReleaseEvent
icon = UrlImage(iconUrl, parent=widget)
icon.resize(50,50)
icon.move(-5, 0)
label = QLabel(text, parent=widget)
label.move(icon.width()+15, widget.height() / 2 - label.height()/4)
self.левоеМеню.addWidget(widget)
контентПанель = QWidget(self.контентЗона)
контентПанель.hide()
контентПанель.setGeometry(0,0, self.контентЗона.width(), self.контентЗона.height())
widget.контентПанель = контентПанель
self.идентификацияПанелей[id] = widget
return контентПанель
def получитьКонтентПанель(self, id : str) -> QWidget:
return self.идентификацияПанелей[id].контентПанель
def приНажатииНаЭлемент(self, widget : QWidget, id : str):
self.получитьКонтентПанель(id).show()
for k, v in self.идентификацияПанелей.items():
if k != id: v.контентПанель.hide()
def добавитьЭлементПользователяВСписок(self, id : str, nickname : str, iconUrl : str, serviceUrl : str):
widget = QWidget()
widget.setGeometry(0,0,200, 50)
widget.setFixedHeight(50)
widget.setFixedWidth(200)
widget.setStyleSheet("""background-color: rgba(0,0,0,155)""")
def OnMouseReleaseEvent(event): pass
widget.mouseReleaseEvent=OnMouseReleaseEvent
labelNickname = QLabel(nickname, parent=widget)
labelNickname.move(widget.height(), 0)
avatar = UrlImage(iconUrl, parent=widget)
avatar.resize(widget.height(), widget.height())
avatar.setStyleSheet("background-color: rgba(0,0,0,0)")
serviceImage = UrlImage(serviceUrl, parent=avatar)
serviceImage.resize(avatar.width() / 2, avatar.height() / 2)
serviceImage.move(avatar.width() / 2, avatar.height() / 2)
self.левоеМеню.addWidget(widget)
class MainWindow(QMainWindow):
def resizeEvent(self, event):
self.меню.setGeometry(0,0, event.size().width(), event.size().height())
self.пользователиМеню.resize(400, self.height())
QMainWindow.resizeEvent(self, event)
def __init__(self):
super(MainWindow, self).__init__()
self.setWindowTitle("Hello World")
self.setCentralWidget(UrlImage("https://c0.wallpaperflare.com/preview/115/811/694/simple-background-abstract-slick.jpg"))
self.меню = ПрокручиваемоеМенюКонтента(self)
пользователи = self.меню.добавитьЭлементВМеню("users", "ПОЛЬЗОВАТЕЛИ", "https://cdn0.iconfinder.com/data/icons/set-ui-app-android/32/8-512.png")
self.пользователиМеню = ПрокручиваемоеМенюКонтента(пользователи)
self.меню.добавитьЭлементВМеню("settings", "НАСТРОЙКИ", "https://icons.veryicon.com/png/256/miscellaneous/standard-general-linear-icon/settings-101.png")
for i in range (3):
self.пользователиМеню.добавитьЭлементПользователяВСписок("id","NICKNAME", "https://www.svgrepo.com/show/384674/account-avatar-profile-user-11.svg", "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSpJ27FVfkM_2ubo4TV6iQXfET93AFER9M6xA&s")
self.пользователиМеню.добавитьЭлементПользователяВСписок("id", "NICKNAME", "https://www.svgrepo.com/show/384674/account-avatar-profile-user-11.svg", "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSpJ27FVfkM_2ubo4TV6iQXfET93AFER9M6xA&s")
self.пользователиМеню.добавитьЭлементПользователяВСписок("id", "NICKNAME", "https://img.freepik.com/premium-vector/professional-male-avatar-profile-picture-employee-work_1322206-66590.jpg", "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR8aMugg7LWDXqkWc-9JlApM4MLPXhi-EPDYA&s")
self.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MainWindow()
app.exec()
изображение в верху шапки должно быть такого же размера как и другие ниже, но по какой то причине изменение размера игнорируется.